文章

类的静态成员_操作符_继承

类的静态成员/操作符/继承

类的静态成员_操作符_继承

类的静态成员/操作符/继承

静态成员 - 属性/方法

  • 使用static关键字来实现类级别的变量和函数
1
2
3
4
5
6
7
8
9
10
11
class Person {
  static String name = '张三';
  static void show() {
    print(name);
  }
}

main() {
  print(Person.name); // 张三
  Person.show(); // 张三
}
  • 静态方法不能访问非静态成员,非静态方法可以访问静态成员或非静态成员
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Person {
  // 静态属性
  static String name = '张三';
  // 非晶态属性
  int age = 20;

  // 静态方法
  static void show1() {
    // 访问静态属性
    print(name);

    // 不能访问非静态属性
    print(this.age); // 报错
  }

  // 非静态方法 - 可以访问静态成员或非静态成员
  void show2() {
    // 访问静态属性
    print(name);
    // 访问非静态属性
    print(this.age);

    // 调用静态方法
    show1();
  }
}

main() {
  print(Person.name); // 张三
  Person.show1(); // 张三

  Person p = new Person();
  p.show2();
}

对象操作符

  • ? 条件运算符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Person {
  String name = '';
  num age = 0;

  Person(this.name, this.age);

  void getInfo() {
    print('${this.name},${this.age}');
  }
}

main() {
  Person p;
  p?.getInfo();
}
  • as 类型转换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Person {
  String name = '';
  num age = 0;

  Person(this.name, this.age);

  void getInfo() {
    print('${this.name},${this.age}');
  }
}

main() {
  var p;
  p = '';
  // 老版本中会报错
  p = new Person('张三', 20);
  
  (p as Person).getInfo(); // 张三,20
}
  • is 类型判断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Person {
  String name = '';
  num age = 0;

  Person(this.name, this.age);

  void getInfo() {
    print('${this.name},${this.age}');
  }
}

main() {
  Person p = new Person('张三', 20);
  
  if(p is Person) {
    p.name = '李四';
    p.getInfo(); // 李四,20
  }
}
  • **..**** 级联操作(连缀) !!!**
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Person {
  String name;
  num age;

  Person(this.name, this.age);

  void getInfo() {
    print('${this.name},${this.age}');
  }
}

main() {
  Person p = new Person('张三', 20);
  p..name = '李四'
    ..age = 30
    ..getInfo(); // 李四,30

  // 等同于
  p.name == '李四';
  p.age == 30;
  p.getInfo();
}

继承

  • 子类使用extends关键字来继承父类
  • 子类会继承父类里面可见的属性和方法,但是不会继承构造函数
  • 子类能复写父类方法 getter/setter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Person {
  String name = '张三';
  num age = 20;

  Person(this.name, this.age);

  void getInfo() {
    print('${this.name},${this.age}');
  }
}

class Man extends Person {
  
}

main() {
  Man m = new Man();
  print(m.name); // 张三
  m.getInfo(); // 张三,20
}

super 关键字的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Person {
  String name;
  num age;

  Person(this.name, this.age);
  
  void getInfo() {
    print('${this.name},${this.age}');
  }
}

class Man extends Person {
  Man(String name, num age) : super(name, age);
}

main() {
  Man m = new Man('张三', 20);
  print(m.name); // 张三
  m.getInfo(); // 张三,20
}

子类扩展自己的属性和方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Person {
  String name;
  num age;

  Person(this.name, this.age);
  
  void getInfo() {
    print('${this.name},${this.age}');
  }
}

class Man extends Person {
  var sex;
  Man(String name, num age, String sex) : super(name, age) {
    this.sex = sex;
  }

  run() {
    print('${this.name},${this.age},${this.sex}');
  }
}

main() {
  Man m = new Man('张三', 20, '男');
  m.run(); // 张三,20,男
}

命名构造函数传参:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Person {
  String name;
  num age;

  Person(this.name, this.age);
  // 命名构造函数
  Person.xxx(this.name, this.age);
  
  
  void getInfo() {
    print('${this.name},${this.age}');
  }
}

class Man extends Person {
  var sex;
  Man(String name, num age, String sex) : super.xxx(name, age) {
    this.sex = sex;
  }

  run() {
    print('${this.name},${this.age},${this.sex}');
  }
}

main() {
  Man m = new Man('张三', 20, '男');
  m.run(); // 张三,20,男
}

复写父类的方法:@override

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Person {
  String name;
  num age;

  Person(this.name, this.age);

  void getInfo() {
    print('${this.name},${this.age}');
  }

  work() {
    print('${this.name}在工作');
  }
}

class Man extends Person {
  Man(String name, num age) : super(name, age);

  run() {
    print('run');
    // 在子类中调用父类
    super.work();
  }

  // 复写父类的方法
  // 建议写上 @override
  @override
  void getInfo() {
     print('姓名:${this.name},年龄:${this.age}');
  }

  @override
  work() {
    print('${this.name}的工作是写代码');
  }
}

main() {
  Man m = new Man('张三', 20);
  m.getInfo(); // 姓名:张三,年龄:20
  m.work(); // 张三的工作是写代码
  m.run(); // 张三在工作
}
本文由作者按照 CC BY 4.0 进行授权