Dart是面對(duì)象編程語(yǔ)言并且是基于mixin的繼承方式。這意味著Dart不能繼承多個(gè)類。
每個(gè)對(duì)象都是class類的實(shí)例,并且除了Null不是對(duì)象之外,其它對(duì)象都是Object
派生對(duì)象。
基于Mixin的繼承意味著每個(gè)類只有一個(gè)父類,一個(gè)類可以在多個(gè)類的主體中被重用,但Object
對(duì)象除外。
Dart的擴(kuò)展方法 Extension methods使你可以在不改變class類或者創(chuàng)建子類的情況下添加函數(shù)到類class。
在本教程中,我們將會(huì)說明如何在dart實(shí)例化類class,打印對(duì)象數(shù)據(jù)類型,初始化實(shí)例變量,訪問實(shí)例變量。
Class類的成員
對(duì)象的成員由函數(shù)和數(shù)據(jù),有時(shí)也成為方法與實(shí)例變量組成。當(dāng)你調(diào)用一個(gè)方法時(shí),是在一個(gè)對(duì)象上調(diào)用它。該方法可以訪問對(duì)象的功能和數(shù)據(jù)。
你可以使用點(diǎn)符號(hào).
訪問實(shí)例的變量和方法。當(dāng)訪問的屬性可能為null空時(shí),請(qǐng)使用?.
代替.
。
var p = Point(2, 2);
// 訪問p對(duì)象y實(shí)例變量.
assert(p.y == 2);
// 在對(duì)象p調(diào)用distanceTo()方法.
double distance = p.distanceTo(Point(4, 4));
// If p is non-null, set a variable equal to its y value.
var a = p?.y;
dart class實(shí)例化
你可以創(chuàng)建一個(gè)對(duì)象使用構(gòu)造函數(shù),構(gòu)成函數(shù)的名稱可以是類名ClassName
或者ClassName.identifier
。
例如下面的代碼創(chuàng)建Point
對(duì)象,使用Point()
和Point.fromJson()
構(gòu)造函數(shù)。
你也可以使用可選的new
調(diào)用構(gòu)造函數(shù)創(chuàng)建對(duì)象,通常沒有人會(huì)使用new關(guān)鍵詞創(chuàng)建對(duì)象。
var p1 = Point(2, 2);
var p2 = Point.fromJson({'x': 1, 'y': 2});
var p1 = new Point(2, 2);
var p2 = new Point.fromJson({'x': 1, 'y': 2});
某些class類會(huì)提供一個(gè)常量構(gòu)造函數(shù),它可用于創(chuàng)建編譯常量。要?jiǎng)?chuàng)建常量構(gòu)造函數(shù),請(qǐng)將const
關(guān)鍵詞放在構(gòu)造函數(shù)名稱的前面。
當(dāng)創(chuàng)建兩個(gè)同樣的編譯時(shí)常量,它們的實(shí)例是一樣的。在常量的上下文,構(gòu)造函數(shù)或者字面量可以省略const
關(guān)鍵詞。
您可以僅使用一次const
關(guān)鍵詞,在變量的前面添加const
關(guān)鍵詞創(chuàng)建常量的上下文。
var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);
assert(identical(a, b)); // 它們是同一個(gè)實(shí)例
// 這種方式使用非常多的常量關(guān)鍵詞
const pointAndLine = const {
'point': const [const ImmutablePoint(0, 0)],
'line': const [const ImmutablePoint(1, 10), const ImmutablePoint(-2, 11)],
};
// 使用const關(guān)鍵詞創(chuàng)建常量上下文
const pointAndLine = {
'point': [ImmutablePoint(0, 0)],
'line': [ImmutablePoint(1, 10), ImmutablePoint(-2, 11)],
};
如果常量構(gòu)造函數(shù)在常量的上下文外部并且在調(diào)用的時(shí)候沒有使用const
關(guān)鍵詞,它會(huì)創(chuàng)建一個(gè)非常量的對(duì)象。
var a = const ImmutablePoint(1, 1); // 創(chuàng)建一個(gè)常量
var b = ImmutablePoint(1, 1); // 不會(huì)創(chuàng)建常量
assert(!identical(a, b)); // 兩個(gè)不同實(shí)例
Dart 打印對(duì)象數(shù)據(jù)類型
要在運(yùn)行時(shí)獲得一個(gè)對(duì)象的類型,你可以訪問Object
的runtimeType
屬性,它會(huì)返回對(duì)象的類型。
要測(cè)試一個(gè)對(duì)象的類型請(qǐng)使用類型測(cè)試操作符,而不是Object
的runtimeType
屬性。
在產(chǎn)品環(huán)境,測(cè)試對(duì)象類型的語(yǔ)句是object is Type
。object is Type
會(huì)比object.runtimeType == Type
更穩(wěn)定。
print('The type of a is ${a.runtimeType}');
// is
if(a is Stream){
print
}
實(shí)例變量
class Point {
double? x; // 聲明instance x,初始值是空null
double? y; // 聲明instance y,初始值是空null
double z = 0; // 聲明instance z,初始值是空null
}
在Dart,所有未初始化的實(shí)例變量是的值是空null。所有實(shí)例變量都會(huì)有一個(gè)隱式getter方法*。*
非最終Non-final實(shí)例變量和late final
實(shí)例變量即使沒有被初始化也會(huì)生成一個(gè)隱式的setter方法,更多詳細(xì)的信息請(qǐng)參考Getters and setters。
如果初始化一個(gè)非late
實(shí)例變量,值會(huì)在創(chuàng)建實(shí)例的時(shí)候被創(chuàng)建。在late
實(shí)例變量初始化之前構(gòu)造函數(shù)和初始化列表會(huì)先被執(zhí)行。
class Point {
double? x; // 聲明實(shí)例變量 x,初始值是空 null
double? y; // 聲明實(shí)例變量 y,初始值是空 null
}
void main() {
var point = Point();
point.x = 4; // 使用x的setter方法
assert(point.x == 4); // 使用x的getter方法
assert(point.y == null); // 值默認(rèn)是null.
}
實(shí)例的變量可以是final
,這種情況下final
的實(shí)例變量必須初始化。要初始化final
, 非late
實(shí)例變量。
請(qǐng)使用構(gòu)造函數(shù)的參數(shù)或者使用構(gòu)造函數(shù)的初始化列表。如果你需要在構(gòu)造函數(shù)的主體之后初始化一個(gè)final
的實(shí)例變量。
你可以工廠構(gòu)造函數(shù)或者使用late final
。在使用late final
的時(shí)候要小心,late final
沒有初始化器添加到API。
class ProfileMark {
final String name;
final DateTime start = DateTime.now();
ProfileMark(this.name);
ProfileMark.unnamed() : name = '';
}
結(jié)論
至此,你已經(jīng)了解dart class的成員組成,dart class實(shí)例化,打印對(duì)象數(shù)據(jù)類型,初始化實(shí)例變量,訪問實(shí)例變量。
-
編程語(yǔ)言
+關(guān)注
關(guān)注
10文章
1952瀏覽量
35279 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4355瀏覽量
63319 -
Class
+關(guān)注
關(guān)注
0文章
53瀏覽量
19815 -
Dart
+關(guān)注
關(guān)注
0文章
9瀏覽量
1777
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論