一、类的创建 & (命名)构造函数 & 简写 & 默认值

  • 构造函数: 是类中与类名相同的方法,只能用于实例化时自动执行的构造器,而不能被实例调用.
  • 设置默认值: 在实例化时,是在构造函数体运行之前初始化实例变量。介于 new 和 constructor 之间。可以被构造函数覆盖。
  1. class Person {
  2. String name;
  3. int age;
  4. // 与类名相同的方法就是默认构造函数
  5. // Person(String name, int age) {
  6. // this.name = name;
  7. // this.age = age;
  8. // }
  9. Person(this.name, this.age);// 构造函数的简写
  10. // 命名构造函数 及 设置默认值
  11. Person.now():name="初始名字name",age=10 {
  12. print("构造函数设置默认值,在构造函数执行之前: ${this.name} -- ${this.age}");
  13. print("格式为`类名.xxx`,其中`xxx`就是命名构造函数; 类比于`new DateTime.now()`");
  14. }
  15. void printInfo() => print("${this.name} -- ${this.age}");
  16. }
  17. void main() {
  18. Person p1 = new Person('张三', 17);
  19. p1.printInfo();
  20. Person p2 = new Person.now();
  21. p2.printInfo();
  22. }

二、类模块化 & 私有属性 & 私有方法

Dart和其他面向对象语言不一样,Data中没有 public private protected 这些访问修饰符号。

  1. 属性和方法加前缀 _ 即可定义为私有 — private。
  2. 不加前缀表示公共的 — public。
  3. 没有protected — protected表示对子女共有,对外部私有。
  • lib/Person.dart

    1. // lib/Person.dart ## 不用导出
    2. class Person {
    3. String _name;
    4. int age;
    5. Person(this._name, this.age);
    6. void _fakePrintInfo() => print("${this._name} -- ${this.age}");
    7. // 私有属性和方法可被 共有方法 使用;
    8. void printInfo() => this._fakePrintInfo();
    9. }
  • main.dart ```dart // main.dart import ‘lib/Person.dart’; // lib相当于配置了alias

main() { Person p1 = new Person(‘张三’, 17); p1.printInfo(); }

  1. <a name="Kew2d"></a>
  2. # 三、setter 和 getter
  3. > 定义 和 使用 的区别
  4. > num数据类型:An integer or floating-point number. 即[int] or [double]
  5. ```dart
  6. class Rect {
  7. num _width;
  8. num height;
  9. Rect(this._width, this.height);
  10. set setheight(num value) {
  11. this.height = value;
  12. }
  13. get area {
  14. return this._width * this.height;
  15. }
  16. }
  17. void main() {
  18. Rect r1 = new Rect(3, 4);
  19. print("面积:${r1.area}");// 通过访问属性的方式访问getter
  20. r1.setheight = 5;// 通过设置属性的方式设置setter
  21. print("执行setter之后的面积:${r1.area}");
  22. }

四、静态方法和属性 — static

  • 静态属性和方法:在不实例化的情况下直接访问;使用 static 修饰。
  • 静态方法不能访问非静态成员,非静态方法可以访问静态成员。
  • 访问静态成员时不用加 this 来访问。
  1. class Rect {
  2. static String name = '我是静态属性';
  3. static void printName()=> print("我是静态方法,可访问静态属性和方法:${name},而且不用使用this访问; 但是不能访问非静态成员");
  4. String getName() {
  5. // printName();
  6. return name;
  7. }
  8. }
  9. void main() {
  10. print(Rect.name);
  11. Rect.printName();
  12. }

五、操作符

5.1类型判断is

  1. print(false is num);
  2. print(p1 is Person);

5.2类型转换as

  1. var p1;
  2. p1 = '';
  3. p1 = nwe Person();
  4. // p1.printInfo(); // 现在能直接,以前版本会报错:不知道是字符串还是Person的实例
  5. (p1 as Person).printInfo();// 类型转换为Person的实例再执行其方法

5.3条件运算符?

不确定是否含有某个属性和方法

  1. p1?.printInfo();

5.4级联(连缀)操作..

  1. p1
  2. ..name = '张三'
  3. ..printInfo();