一、类的创建 & (命名)构造函数 & 简写 & 默认值
- 构造函数: 是类中与类名相同的方法,只能用于实例化时自动执行的构造器,而不能被实例调用.
- 设置默认值: 在实例化时,是在构造函数体运行之前初始化实例变量。介于 new 和 constructor 之间。可以被构造函数覆盖。
class Person {String name;int age;// 与类名相同的方法就是默认构造函数// Person(String name, int age) {// this.name = name;// this.age = age;// }Person(this.name, this.age);// 构造函数的简写// 命名构造函数 及 设置默认值Person.now():name="初始名字name",age=10 {print("构造函数设置默认值,在构造函数执行之前: ${this.name} -- ${this.age}");print("格式为`类名.xxx`,其中`xxx`就是命名构造函数; 类比于`new DateTime.now()`");}void printInfo() => print("${this.name} -- ${this.age}");}void main() {Person p1 = new Person('张三', 17);p1.printInfo();Person p2 = new Person.now();p2.printInfo();}
二、类模块化 & 私有属性 & 私有方法
Dart和其他面向对象语言不一样,Data中没有 public private protected 这些访问修饰符号。
- 属性和方法加前缀
_即可定义为私有 — private。- 不加前缀表示公共的 — public。
- 没有protected — protected表示对子女共有,对外部私有。
lib/Person.dart
// lib/Person.dart ## 不用导出class Person {String _name;int age;Person(this._name, this.age);void _fakePrintInfo() => print("${this._name} -- ${this.age}");// 私有属性和方法可被 共有方法 使用;void printInfo() => this._fakePrintInfo();}
main.dart ```dart // main.dart import ‘lib/Person.dart’; // lib相当于配置了alias
main() { Person p1 = new Person(‘张三’, 17); p1.printInfo(); }
<a name="Kew2d"></a># 三、setter 和 getter> 定义 和 使用 的区别> num数据类型:An integer or floating-point number. 即[int] or [double]```dartclass Rect {num _width;num height;Rect(this._width, this.height);set setheight(num value) {this.height = value;}get area {return this._width * this.height;}}void main() {Rect r1 = new Rect(3, 4);print("面积:${r1.area}");// 通过访问属性的方式访问getterr1.setheight = 5;// 通过设置属性的方式设置setterprint("执行setter之后的面积:${r1.area}");}
四、静态方法和属性 — static
- 静态属性和方法:在不实例化的情况下直接访问;使用 static 修饰。
- 静态方法不能访问非静态成员,非静态方法可以访问静态成员。
- 访问静态成员时不用加 this 来访问。
class Rect {static String name = '我是静态属性';static void printName()=> print("我是静态方法,可访问静态属性和方法:${name},而且不用使用this访问; 但是不能访问非静态成员");String getName() {// printName();return name;}}void main() {print(Rect.name);Rect.printName();}
五、操作符
5.1类型判断is
print(false is num);print(p1 is Person);
5.2类型转换as
var p1;p1 = '';p1 = nwe Person();// p1.printInfo(); // 现在能直接,以前版本会报错:不知道是字符串还是Person的实例(p1 as Person).printInfo();// 类型转换为Person的实例再执行其方法
5.3条件运算符?
不确定是否含有某个属性和方法
p1?.printInfo();
5.4级联(连缀)操作..
p1..name = '张三'..printInfo();
