Dart 是一种基于类和 mixin 继承机制的面向对象的语言。 每个对象都是一个类的实例,所有的类都继承于 Object,这个和java语言没什么区别
使用类成员变量
我们看一下类的初始化以及赋值
//类的初始化
var p = Point(2, 2);
// 为实例的变量 y 设置值。
p.y = 3;
使用 ?. 来代替 . , 可以避免因为左边对象可能为 null , 导致的异常:
// 如果类p不为null,设置它的变量 y 等于 4。
p?.y = 4;
这个不同于java要有个空判断,这里不需要判断,直接赋值符合前面加个?即可。
使用构造函数
创建类的实例有两种方式,一种是通过类名,一种是通过类的标识符
void main() {
var p1 = Human('男');
var p2 = new Human('男');
var p3 = Human.male('male', 2);
var p4 = new Human.male('male', 2);
}
class Human {
String gender;
int age;
Human(this.gender) {}
Human.male(this.gender, this.age) {}
}
上面定义了一个Human类,创建类的实例的时候可以使用new,也可以不使用new。如果有常量构造函数,也可以通过在前面加上const创建一个常量,如果创建两个相同的实例前面都有const,你们这两个实例是相等的,否则不相等,我们来测试一下
void main() {
var p1 = Human('男', 1);
var p2 = Human('男', 1); // 创建一个非常量对象
var p3 = const Human('男', 1);// 创建一个常量对象
var p4 = const Human('男', 1);
print(p1==p2);
print(p3==p4);
print(p1==p3);
}
class Human {
final String gender;
final int age;
const Human(this.gender, this.age);
}
运行结果为
false
true
false
因为p3和p4是常量,所以他们初始化的对象是相等的,
获取一个对象类型
使用对象的runtimeType关键字可以获取对象的类型,
void main() {
var p1 = Human('男', 1);
print('The type of a is ${p1.runtimeType}');
}
运行结果为
The type of a is Human
实例变量
我们之前说过在dart中数字也是个对象,所以当他没初始化的时候,没人值为null,这个和java语言有点区别,我们看下
class Point {
num x; // 声明示例变量 x,初始值为 null 。
num z = 0; // 声明示例变量 z,初始值为 0 。
}
构造函数
在没有声明构造函数的情况下, Dart 会提供一个默认的构造函数。 默认构造函数没有参数并会调用父类的无参构造函数。这个和java很相似,有参数的构造函数书写有两种方式
class Human1 {
num x, y;
Human1(num x, num y) {
this.x = x;
this.y = y;
}
}
class Human2 {
num x, y;
Human2(this.x, this.y);
}
这两种方式实现的结果都一样,第一种方式是java中常见的,第二种方式相对来说更简洁一些。构造函数还可以像上面通过添加标识符来构建。构造函数不能够被继承,父类的命名构造函数不会被子类继承。 如果希望使用父类中定义的命名构造函数创建子类, 就必须在子类中实现该构造函数。
class Human2 {
num x, y;
Human2(this.x, this.y);
// 标识符构造函数
Human2.origin() {
x = 0;
y = 0;
}
}
使用标识符构造函数可为一个类实现多个构造函数。如果父类中没有无参的构造函数, 则需要手工调用父类的其他构造函数。 在当前构造函数冒号 (? 之后,函数体之前,声明调用父类构造函数。
class Person {
String firstName;
Person.fromJson(Map data) {
print('in Person');
}
}
class Employee extends Person {
Employee.fromJson(Map data) : super.fromJson(data) {
print('in Employee');
}
}
main() {
var emp = new Employee.fromJson({});
if (emp is Person) {
emp.firstName = 'Bob';
}
(emp as Person).firstName = 'Bob';
}