Skip to content
章节导航

面向对象

三大特征(编程思想):封装、继承、多态

定义一个类

定一个Dart类,所有类都继承自Object

shell
class Person {
  String? name;
  int? age;

  Person(this.name, this.age);

  ///重写父类方法
  @override
  String toString() {
    return 'name:$name, age:$age';
  }
}

使用这个类

shell
void main() {
  //请看控制台输出
  Person person = Person('Jack', 19);
  print(person.toString());
 }

继承

shell
class Student extends Person {
  //定义类的变量
  String? _school; //通过下划线来标识私有字段(变量)
  String? city;
  String? country;
  String? fullName;
  static Student? instance;

  ///构造方法:
  ///通this.school初始化自有参数
  ///name,age交给父类进行初始化
  ///city为可选参数
  ///country设有默认参数
  Student(this._school, String? name, int? age,
      {this.city, this.country = 'China'})
      ///初始化列表:除了调用父类构造器,在子类构造器方法体之前,你也可以初始化实例变量,不同的初始化变量之间用逗号分隔开
      : fullName = '$country.$city',
        ///如果父类没有默认构造方法(无参构造方法),则需要在初始化列表中调用父类构造方法进行初始化
        super(name, age) {
    ///构造方法体不是必须的
  }

  //命名构造方法:[类名+.+方法名]
  //使用命名构造方法为类实现多个构造方法
  //   Student student1 = Student.cover(student, '211');
  Student.cover(Student stu, this._school) : super(stu.name, stu.age) {
    print('命名构造方法');
  }

  //命名工厂构造方法:factory [类名+.+方法名]
  //它可以有返回值,而且不需要将类的final变量作为参数,是提供一种灵活获取类对象的方式。
  factory Student.stu(Student stu) {
    return Student(stu._school, stu.name, stu.age,
        city: stu.city, country: stu.country);
  }

  @override
  String toString() {
    return 'name:$name school:$_school,city:$city,country:$country ${super.toString()}';
  }

  //可以为私有字段设置getter来让外界获取到私有字段
  String? get school => _school;

  //可以为私有字段设置setter来控制外界对私有字段的修改
  set school(String? value) {
    _school = value;
  }

  //静态方法
  static doPrint(String str) {
    print('doPrint:$str');
  }

  ///科普小知识:实例方法,对象的实例方法可以访问到实例变量与this,如上述代码中的toString
}