概述

  1. Dart 没有 public/private 关键字,以下划线 _ 开头表示私有.
  2. Dart 不允许像 Java/C++ 那样通过 “同名不同参数” 来重载构造函数,提供了命名构造函数来实现多种初始化方式.

代码示例

void main() {
  // 使用默认构造函数
  var p = Person("Alice", 20);
  p.introduce();

  // 使用 setter 修改年龄
  p.age = 25;
  print("修改后年龄: ${p.age}");

  // 使用命名构造函数
  var p2 = Person.fromBirthYear("Bob", 2000);
  p2.introduce();

  // 子类 Student
  var s = Student("Charlie", 18, "S12345");
  s.introduce();
  s.study();
}

// ===============================
// 父类 Person
// ===============================
class Person {
  String name;
  int _age; // 私有字段(文件内可访问)

  // 默认构造函数
  Person(this.name, this._age);

  // 命名构造函数:通过出生年份计算年龄
  Person.fromBirthYear(this.name, int birthYear)
      : _age = DateTime.now().year - birthYear;

  // getter
  // 让外部代码可以像访问属性一样读取 _age
  int get age => _age;

  // setter(带简单校验)
  set age(int value) {
    if (value > 0) {
      _age = value;
    }
  }

  // 方法
  void introduce() {
    print("我叫 $name,今年 $age 岁");
  }
}

// ===============================
// 子类 Student 继承 Person
// ===============================
class Student extends Person {
  String studentId;

  // 子类构造函数必须调用父类构造
  Student(String name, int age, this.studentId) : super(name, age);

  // 子类新增方法
  void study() {
    print("$name 正在学习中...");
  }

  // 重写父类方法
  @override
  void introduce() {
    print("我是学生 $name,年龄 $age,学号 $studentId");
  }
}