Flutter——dart 面向对象(一)
1. 类与对象
在Flutter中,使用class
关键字声明一个类
,使用new
加上构造函数
生成一个对象
,所有的对象都默认继承Object类。Dart中会默认生成getter 和 setter方法,属性和方法都通过点语法
进行访问,Dart方法不支持重载。final修饰的属性必须定义初始值。
声明一个类:
class LGPerson {
String? name;
int? age;
final String hobby = 'coding';
void run() {
print("name:$name age:$age");
}
}
声明一个对象和方法调用:
LGPerson p = LGPerson();
p.name = 'LS';
p.age = 18;
p.run();
在Dart中,同文件是不存在私有化的,只有在不同文件中,才能有私有属性。 新建一个文件,并添加一个新的LGTeacher类,只对外暴露height属性和printTeacher方法。
class LGTeacher {
String? _name;
int? _age;
int? height;
void _run() {
print("name:$_name age:$_age");
}
void printTeacher() {
_run();
}
}
这里可以看到,外部就无法访问私有属性和方法了,而如果是同一个文件里面的class,则依然可以访问。
2. 构造函数
定义完一个类之后,这个类默认就有构造函数。相当于:
LGperson(){}
这里可以自定义构造函数,如果自定义了构造函数,那么默认的构造函数就无效了。
LGPerson(int age,String name){
_name = name;
_age = age;
}
LGPerson p = LGPerson(18,"test");
如果这里不是私有属性的话, 就会出现属性和参数名字一样的情况:
name = name;
age = age;
这里可以将参数改名字
或者在属性前面加this.
,但是推荐使用Dart语法糖来自动赋值。
LGPerson(this.age,this.name);
用了这个语法糖之后,属性也可以不需要变成Nullability的。
class LGPerson {
String name;
int age;
LGPerson(this.age,this.name);
void run() {
print("name:$name age:$age");
}
}
如果属性使用final修饰的,那么这个属性之后就不能改变了。
class 里面还可以创建命名构造函数:
LGPerson.withName(this.name,this.age);
// 调用
LGPerson p2 = LGPerson.withName("kk", 18);
final
有什么存在的意义呢?其实这里有个应用场景,就是常量对象。
当一个类的所有属性用final
修饰,构造方法用const
修饰,那么创造出来的对象就是常量对象了。(这里需要所有属性都用final修饰,否则构造方法用const修饰就会报错)。
class LGPerson {
final String name;
final int age;
final int height;
const LGPerson(this.age,this.name,this.height);
// LGPerson.withName(this.name,this.age);
void run() {
print("name:$name age:$age");
}
}
转载自:https://juejin.cn/post/7013570319004729357