Flutter - Dart 基础(关于类的默认构造函数、命名构造函数、初始化列表)

1,378 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

类的定义

Dart 是一个面向对象的编程语言,所有的类都继承于 Object。在 Dart 中,使用class 关键字声明一个类,后面跟类名,并且由一对花括号包围

class Student {
    String? name;
    int? age;

    void sayHI() {
    
    }
}

构造方法

默认构造函数

如果没有声明构造函数,那么 Dart 会自动生成一个无参数的构造函数,并且该构造函数会调用其父类的无参数构造方法

class Student {
    String? name;
    int? age;

    void sayHI() {
    
    }
}


void main(List<String> args) {
    var stu = Student();
}

如果有了自定义的构造函数时,默认的构造函数就可以使用了,这是因为 Dart 不支持函数重载(即方法名相同,参数不同)

class Student {
    String? name;
    int? age;
    
    Student(String name, int age) {
        this.name = name;
        this.age = age;
    }    
}


void main(List<String> args) {
    var stu = Student("dart", 18);
}

在 Dart 中,提供了一种特殊的语法糖来简化该步骤

class Student {
    String? name;
    int? age;
    Student(this.name,this.age);
}

命名构造函数

由于 Dart 中不支持函数重载,但是实际开发中又需要其他的构造函数,这时需要使用命名构造函数

class Student {
    String? name;
    int? age;
    double? height;


    Student(this.name, this.age);

    // 命名构造函数
    Student.withNameAgeHeight(this.name, this.age, this.height);
    
    Student.withMap(Map<String, dynamic> map) {
        this.name = map["name"];
        this.age = map["age"];
        this.height = map["height"];
    }
    
    // 重写 toString 方法,可以打印出具体的对象信息
    @override
    String toString() {
        return "$name $age $height";
    }
}

void main(List<String> args) {
    var stu = Student("dart", 18);
    var stu1 = Student.withNameAgeHeight("dart", 18, 180.0);
    var stu2 = Student.withMap({
        "name": "dart",
        "age": 18,
        "height": 180.0
    });
    
    print(stu1);
    print(stu2);
    print(stu3);
}

log:
dart 18 null
dart 18 180.0
dart 18 180.0

初始化列表

在 Dart 中,可以在构造函数体运行之前初始化实例变量,每个实例变量之间使用逗号分隔

class Student {
    String? name;
    int? age;
    double? height;
    
    // 初始化列表
    Student(this.name)
        : age = 12,
          height = 180.0 {
        print(this.name);
    }
    
    // 重写 toString 方法,可以打印出具体的对象信息
    @override
    String toString() {
        return "$name $age $height";
    }
}

void main(List<String> args) {
    var stu = Student("dart");
    print(stu.toString());
}

log:
dart
dart 12 180.0