一、类的创建 & (命名)构造函数 & 简写 & 默认值
- 构造函数: 是类中与类名相同的方法,只能用于实例化时自动执行的构造器,而不能被实例调用.
- 设置默认值: 在实例化时,是在构造函数体运行之前初始化实例变量。介于 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]
```dart
class 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}");// 通过访问属性的方式访问getter
r1.setheight = 5;// 通过设置属性的方式设置setter
print("执行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();