一.类的组成部分及调用方式
class Person{
//声明变量类型
String name;
int age;
String sex;
//默认构造函数最初写法
Person (String name,int age,String sex){
print("默认构造函数函数体里的打印");
}
//默认构造函数简写,可以使用this(和上面构造函数二选一,推荐简写)
Person({this.name,this.age,this.sex});
//命名构造函数
Person.now(){
print('命名构造函数now的函数体打印');
}
//类的普通方法(void表示函数没有返回值)
void printInfo(){
print("类的printInfo方法::${this.name}--${this.age}--${this.sex}");
}
//setter方法,关键字set声明的方法,一般用于设置单个属性值
set setInfo(String name){
this.name=name;
}
//getter方法,关键字get声明的方法,一般用来获取类的某些属性
get getInfo{
return "getter方法::${this.name}--${this.age}--${this.sex}";
}
}
void main(){
Person p1=new Person('张三',20,'man');//实例并调用类的默认构造函数
Person p2=new Person.now();//实例并调用类的命名构造函数
p1.printInfo();//调用printInfo方法
p1.setInfo="李四";//调用set方法重写属性
print(p1.getInfo);//打印get方法拿到的数据
}
二.extends继承、覆写父类方法及super关键字
//父类 Person
class Person {
String name;
int age;
Person(this.name,this.age);
Person.now(){
print('now');
}
printInfo(){
print("父类方法::$name--$age");
}
}
//子类 Son
class Son extends Person {
String sex;
//继承父类属性并将实例化时传来的sex赋值到this.sex
Son(String name,int age,String sex):super(name,age){
this.sex=sex;
}
run(){
super.printInfo();//调用父类方法-使用super.方法名()
print(this.name);//调用父类属性-使用this.
}
@override //覆写父类同名方法约定使用@override标注
printInfo() {
print("此方法覆写父类同名方法::$name--$age");
}
}
void main(){
Son s1=new Son("王五",23,"女");
s1.run();
s1.printInfo();
}
三.abstract抽象类
- 特点:
1.使用abstract关键字定义一个抽象类
2.定义方法不实现,让子类去实现
3.不可直接实例抽象类--调用时体现
- 应用场景:
定义一个类的标准,适用于定义接口
abstract class Animal {
eat();
run();
}
class Dog extends Animal {
eat(){
print('Dog--eat');
}
run(){
print('Dog--run');
}
}
void main(){
// var a1=new Animal(); //不可直接实例抽象类
Dog d1=new Dog();//可以实例继承抽象方法的子类
d1.eat();
d1.run();
}
四.Mixin混入
- 特点:(配合代码理解)
1.作为被Son继承的mixin类 只可以继承自Object类 不可继承自其它类
2.作为被Son继承的mixin类 不可有构造函数
3.继承多个类重复的方法,后面覆盖前面的处理方式
4.继承后的Son子类is类型检测时 同属于A,B,Person 结果都为true
5.mixin不是继承 不是接口 是新特性
- 应用场景:
可实现多继承
class Person {
String name;
Person(this.name);
printInfo(){
print("${this.name}");
}
}
// class A extends Person{ //错误代码:作为被Son继承的mixin类 只可以继承自Object类 不可继承自其它类
// A(String name):super(name); //错误代码:作为被Son继承的mixin类 不可有构造函数
// printInfo(){
// print("${this.name}");
// }
// }
class A {
printInfo(){
print("A");
}
}
class B {
printInfo(){
print("B");
}
}
class Son extends Person with A,B {//with后的A、B两个类以mixin形式被继承
Son(String name):super(name);
}
void main(){
Son s1=new Son('我是abc');
s1.printInfo();//打印字符串B
}
五.接口
abstract class Db1 {
add();
}
abstract class Db2 {
save();
}
class Mysql implements Db1,Db2 { //多个接口应用场景 使用implements接口1,接口2......
@override
add() {
print('add');
}
save() {
print('save');
}
}
void main(){
Mysql m1=new Mysql();
m1.add();
m1.save();
}
六.类设置初始变量值
class Person {
String name;
int age;
Person():name="张三",age=21{
}
printInfo(){
print("${this.name}--${this.age}");
}
}
void main(){
Person p1=new Person();
p1.printInfo();//张三--21
}
七.类的静态属性
//使用static关键字声明的属性和方法视为静态成员
class Person {
String name;
int age;
static String sex="女";
Person(this.name,this.age);
printInfo(){
print(this.name);
}
printInfo2(){
print(sex);//非静态方法可以访问静态成员
}
static void staticfn(){
print(name);//静态方法不可以访问非静态成员
}
static void staticfn2(){
print(sex);
}
}
void main(){
Person p1=new Person("张三",20);
}
八.类的私有属性
- 实现私有的条件:
1.私有成员声明时变量名前要有_
2.将带有私有成员的类分离出去
//存放私有属性方法的private.dart文件
class Person {
String name;
int age;
String _sex;//私有属性
Person(this.name,this.age,this._sex);
myfn1(){
print('myfn1');
}
_myfn2(){//私有方法
print('myfn2');
}
getSelfValue(){//普通方法抛出私有属性
return this._sex;
}
getSelfFn(){//普通方法调用私有方法
return this._myfn2();
}
}
//要调用私有成员的文件
import 'libs/private.dart';
void main(){
Person p1=new Person("张三",20,"男");
//实例可以访问普通属性、方法
print(p1.name);
p1.myfn1();
//实例不可以访问私有属性、方法
// print(p1._sex);
// p1._myfn2();
//为了可以访问私有属性 调用普通方法抛出私有属性
print(p1.getSelfValue());
//为了可以访问私有方法 调用普通方法抛出私有方法
p1.getSelfFn();
}
九.泛型
//泛型类
class Person<N,A> {
N name;
A age;
Person(this.name,this.age);
set setInfo(N n){ //调用此方法必须传入N类型数据
this.name=n;
}
get getInfo{
return "{name:${this.name},age:${this.age}}";
}
}
void main(){
Person p1=new Person<String,int>('张三', 111);
p1.setInfo='李四';
print(p1.getInfo);//name:李四,age:111
}
//泛型方法
T getData1<T>(T name){ //校验返回类型
return name;
}
getData2<T>(T name){ //不校验返回类型
return 123;
}
void main(){
print(getData1<String>("张三"));
print(getData2<String>("张三"));
}
//泛型接口
abstract class Person<T> {
getValue(String key);
setValue(String key,T value);
}
class Man<T> implements Person<T> {
@override
getValue(String key) {
return null;
}
@override
setValue(String key,T value) {
print("Man--设置$key=$value");
}
}
class Woman<T> implements Person<T> {
@override
getValue(String key) {
return null;
}
@override
setValue(String key,T value) {
print("Woman--设置$key=$value");
}
}
main(){
Person p1=new Man<int>();//实例时尖括号传入类型
p1.setValue("键值", 111);//调用对应方法按照声明时一致类型传入即可
}
十.库的使用
// 1.自定义库 使用import "libs/selfApi.dart"; 直接调用即可
// 2.引入dart的内置库 使用import "dart:io"; 直接调用即可
// 3.引入第三方库
// (1).找到你要用的库 https://pub.dev/packages
// (2).创建一个pubspec.yaml配置文件 name--名称 description--描述 dependencies--依赖的库:版本
// (3).终端运行pub get下载依赖库
// (4).看文档按照指定方式具体使用