深入理解Dart编程语言:构造方法的奥秘

发表时间: 2022-11-27 10:16

#头条创作挑战赛#

本文同步本人掘金平台的文章:
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();}复制代码

题外:Getters 和 Setters

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);}复制代码

构造函数的执行顺序

  1. 调用初始化列表
  2. 调用父类的构造函数
  3. 调用自己的构造函数

如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏