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';
}