dart 學習 建構函式

2022-07-19 09:45:09 字數 2765 閱讀 2715

dart 建構函式

classname(...)

//普通建構函式

普通建構函式

這就是我們普通的建構函式,其樣子和其它語言幾乎一樣

class

point

}上例中只有兩個成員變數,如果有10個,豈不是麻煩死?所以dart有語法糖給你哦:

class

point

它可以將x,y的賦值變得簡單一些,就不用寫建構函式的方法體了,記得括號後用分號哦。

classname.identifier(...)

//命名建構函式

命名建構函式

class

point

}請記住,命名建構函式不可繼承,如果子類想要有 和父類一樣的命名建構函式,那就寫個同名的(通常也會在子類的命名建構函式裡,呼叫父類的同名命名建構函式)

const classname(...) //

常量建構函式

常量建構函式總結如下幾點:

常量建構函式需以const關鍵字修飾

const建構函式必須用於成員變數都是final的類

構建常量例項必須使用定義的常量建構函式

如果例項化時不加const修飾符,即使呼叫的是常量建構函式,例項化的物件也不是常量例項

下面結合例項,對以上幾點加以說明

正確的常量建構函式定義

根據以上的總結,定義乙個point類,包含乙個常量建構函式,注意其成員變數都是final型別,且建構函式用const修飾

class

point

常量建構函式需以const關鍵字修飾

如下**定義乙個const物件,但是呼叫的構造方法不是const修飾的,則會報the constructor being called isn't a const constructor.錯誤

void

main()

class

point

const建構函式必須用於成員變數都是final的類

如下**中成員變數x為非final,會報can't define a const constructor for a class with non-final fields.錯誤

class

point

構建常量例項必須使用定義的常量建構函式

如下**,定義乙個const物件,但是呼叫的卻是非常量建構函式,會報the constructor being called isn't a const constructor.錯誤

void

main()

class

point , $)';

}}如果例項化時不加const修飾符,即使呼叫的是常量建構函式,例項化的物件也不是常量例項

如下**,用常量建構函式構造乙個物件,但是未用const修飾,那麼該物件就不是const常量,其值可以再改變

void

main()

class

point , $)';

}}factroy classname(...)

//工廠建構函式

工廠建構函式的定義

工廠建構函式是一種建構函式,與普通建構函式不同,工廠函式不會自動生成例項,而是通過**來決定返回的例項物件.

工廠建構函式的關鍵字為factory,下面我們用工廠建構函式寫乙個只能創造乙個例項的類.

class

a

return

a.cache;

} a.newobject(

this

.name);

}void

main()

a類具有乙個名為cache的靜態成員,它將快取a類的第乙個例項.

在工廠建構函式a中,首先判斷a.cache是否已經存在例項(即判斷是否是第一次例項化),如果存在則返回快取的例項,不存在則新建乙個例項並快取.

a.newobject是乙個命名建構函式,用於建立例項.

執行這段**,會輸出

helloworld

helloworld

true

其中字串」helloworld」是第乙個例項的name成員,在宣告變數b時改用了」hellodart」,但返回的例項的name成員仍然是」helloworld」.

再用===運算子判斷一下它們是否屬於同乙個物件,結果為true,變數a和b指向的是同乙個物件.

3.8.2工廠建構函式的特性

工廠建構函式類似於static靜態成員,無法訪問this指標,所以在工廠建構函式中能處理的任務較為有限.

使用工廠建構函式時往往需要定義乙個命名建構函式用來生產例項.

注意點初始化列表

初始化列表的執行順序,在整個建構函式的最前面,它除了可以呼叫父類的建構函式,還可以在建構函式方法體之前,初始化一些成員變數。

//initializer list sets instance variables before

//the constructor body runs.

point.fromjson(mapjson)

: x = json['x'],

y = json['y']

尤其是初始化那些final修飾的成員變數時,初始化列表很有用,因為在方法體中,不能給final修飾的成員變數賦值,因為在執行方法體的時候,final修飾的成員變數已經不能變了。這個地方很多人犯錯。

import 'dart:math';

class

point

main()

參考://

Dart建構函式

2.構造函式呼叫父類建構函式的順序 3.建構函式傳遞 classname 普通建構函式 classname.identifier 命名建構函式 const classname 常量建構函式 factroy classname 工廠建構函式使用 var p1 point 2 2 dart2中,可以省略...

Dart關於繼承中建構函式一兩事

dart關於父類子類中建構函式的一些事情 dart中,類的過載是乙個小特點,不允許同名的建構函式。放到繼承中,一開始就出現點問題。比如如下 class animal animal.fromage int age void eating animal中,定義了無參建構函式,那麼帶引數建構函式,就只能用...

dart 學習筆記

dart version dart vm version 1.24.3 wed dec 13 23 26 59 2017 on macos x64 不一樣,提示報錯 2.提示錯誤 本書並非詳盡無遺,只是簡單介紹一下這種語言,供喜歡以身作則的人學習。您可能還想檢視語言和庫教程 簡單的helloworl...