官术网_书友最值得收藏!

2.2.1 構(gòu)造函數(shù)和初始化塊

在Kotlin中,類的構(gòu)造函數(shù)可以包括一個(gè)主構(gòu)造函數(shù)和N個(gè)次構(gòu)造函數(shù)。

1.主構(gòu)造函數(shù)

Kotlin的主構(gòu)造函數(shù)可以借助初始化塊對(duì)代碼進(jìn)行初始化。Kotlin使用init關(guān)鍵字作為初始化塊的前綴。

對(duì)上述代碼進(jìn)行反編譯后會(huì)發(fā)現(xiàn),init初始化塊的代碼會(huì)包含在無參數(shù)的構(gòu)造函數(shù)中,如圖2-3所示。

圖2-3 init初始化塊反編譯后

上述Kotlin代碼等價(jià)于使用constructor關(guān)鍵字作為構(gòu)造函數(shù)的函數(shù)名,不過此時(shí)可以省略函數(shù)名。

主構(gòu)造函數(shù)的特性:

· 主構(gòu)造函數(shù)可以省略constructor,無論在主構(gòu)造函數(shù)中是否包含參數(shù)。

· 初始化塊可以有多個(gè),調(diào)用主構(gòu)造函數(shù)時(shí)會(huì)按照初始化塊的順序執(zhí)行。

2.次構(gòu)造函數(shù)

Kotlin的次構(gòu)造函數(shù)同樣使用constructor作為函數(shù)名,但不能省略函數(shù)名。次構(gòu)造函數(shù)可以包含代碼,調(diào)用次構(gòu)造函數(shù)時(shí)必須調(diào)用主構(gòu)造函數(shù),這一點(diǎn)非常重要。

執(zhí)行結(jié)果如下:

     hello
     hello world
     this is foo function

如果類中出現(xiàn)多個(gè)初始化塊,就會(huì)按照順序依次執(zhí)行。實(shí)際上,多個(gè)初始化塊的代碼會(huì)按照順序合并到主構(gòu)造函數(shù)中。

執(zhí)行結(jié)果:

     hello1
     hello2
     hello3
     hello world
     this is foo function

通過反編譯上述代碼,能夠更清晰地了解次構(gòu)造函數(shù)的調(diào)用方式,如圖2-4所示。

圖2-4 次構(gòu)造函數(shù)反編譯后

次構(gòu)造函數(shù)的特性:

· 類可以擁有多個(gè)次構(gòu)造函數(shù)。

· 主構(gòu)造函數(shù)的屬性可以使用var、val修飾,次構(gòu)造函數(shù)不能使用它們進(jìn)行修飾。

· 每個(gè)次構(gòu)造函數(shù)需要委托給主構(gòu)造函數(shù),調(diào)用次構(gòu)造函數(shù)時(shí)會(huì)先調(diào)用主構(gòu)造函數(shù)以及初始化塊。

所以,類的初始化塊、主構(gòu)造函數(shù)、次構(gòu)造函數(shù)的執(zhí)行順序?yàn)椋侯惖某跏蓟瘔K按先后順序執(zhí)行→類的主構(gòu)造函數(shù)→類的次構(gòu)造函數(shù)。

主站蜘蛛池模板: 昭平县| 和田市| 夹江县| 安图县| 胶南市| 安仁县| 天全县| 雷山县| 海晏县| 鄂托克旗| 丽水市| 泸西县| 桓仁| 板桥市| 阳朔县| 崇仁县| 南城县| 松滋市| 乌鲁木齐市| 丹东市| 襄樊市| 固安县| 申扎县| 额济纳旗| 阿克陶县| 旬阳县| 泗阳县| 临高县| 宜兴市| 木兰县| 太仆寺旗| 防城港市| 南郑县| 赤城县| 长海县| 桦南县| 扶绥县| 文水县| 梁山县| 浠水县| 双桥区|