#头条创作挑战赛#
本文同步本人掘金平台的文章:
https://juejin.cn/post/7127086961843503111
上一篇文章Dart 知识点 - 面向对象基础中,我们已经初步了解了类的构造方法,本文,我们详细来学习一下构造函数。
推荐使用线上编辑器 dartpad.cn 进行学习,测试~
构造函数是类中的特殊方法。Dart 中的每个类都有一个默认的构造方法,并且可以有一个以上的构造方法。
通过创建一个和类名一样的方法,来声明一个构造函数,在初始化对象的时候,自动调用。比如上文所举例:
void main() { var person = new Person('Jimmy', 100); person.sayHi(); // Hello Jimmy.}class Person { String name = ''; double height = 0.0; // 构造函数 Person(this.name, this.height); // 初始化对象,默认调用构造方法 sayHi() { print('Hello ' + this.name + '.'); }}复制代码
我们还可以通过 ClassName.identifier 方式来调用,比如:
void main() { var person = Person.fromJson({ 'name': 'Jimmy', 'height': 100, }); person.sayHi(); // Hello Jimmy. print(person.toJson()); // {name: Jimmy, height: 100}\}class Person { String name = ''; double height = 0.0; /* * ClassName.identifier 形式构造方法 * */ Person.fromJson(Map<String, dynamic> json) { name = json['name']; height = json['height']; } // 将当前对象转化成 Json 数据 Map<String, dynamic> toJson() { final Map<String, dynamic> data = Map<String, dynamic>(); data['name'] = this.name; data['height'] = this.height; return data; } sayHi() { print('Hello ' + this.name + '.'); }}复制代码
Dart 中不支持构造方法的重载,但是我们可以使用命名构造方法实现多个构造方法让代码更加清晰。命名构造方法格式:类名.方法名,比如下面
void main() { // 调用 Person 类的构造方法 var person = Person.init(); // 命名构造方法}class Person { String name = ''; double height = 0.0; Person(this.name, this.height); Person.init() { print('命名构造方法'); }}复制代码
构造方法不被子类继承,如果希望使用父类的中的命名构造方法创建子类,那么要在子类中实现该构造方法。
void main() { // 调用 Person 类的构造方法 var person = Person.init(); // 命名构造方法 var student = Student.init(); // 命名构造方法}class Person { String name = ''; double height = 0.0; Person(this.name, this.height); Person.init() { print('命名构造方法'); }}class Student extends Person { Student.init():super.init();}复制代码
如果类生成的对象不可以改变,那就需要常量构造方法。其所有的实例变量都是 final 的。如下:
void main() { var person = ImmutablePerson.instance; print(person.name); // Jimmy}class ImmutablePerson{ static final ImmutablePerson instance = const ImmutablePerson('Jimmy'); final String name = 'Jimmy'; // 构造方法 const ImmutablePerson(name);}复制代码
构造方法就是单例模式,缓存之前创建的实例。工厂构造方法需要构造方法之前添加 factory 关键字。
class Student { static Student student; // 工厂构造方法 factory Student() { if(student == null) { student = Student.init(); } // 已经创建 return instance } Student.init();}复制代码
get() 和 set() 方法是专门用于读取和写入对象的属性的方法。
get 和 set 是隐式存在
void main() { var person = Person('Tom', 0.0); print(person.name); // Jimmy print(person.height); // 100}class Person { double get height => 100.0; String get name => 'Jimmy'; Person(name, height);}复制代码
如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏