Kotlin基礎(chǔ)教程之面向?qū)ο?/h1>
更新時(shí)間:2017年05月27日 10:24:16 作者:天命劍主
這篇文章主要介紹了Kotlin基礎(chǔ)教程之面向?qū)ο蟮南嚓P(guān)資料,需要的朋友可以參考下
Kotlin 面向?qū)ο?/strong>
這幾天一直在準(zhǔn)備考試,實(shí)在沒(méi)有時(shí)間,已經(jīng)過(guò)去了這么久,終于要到面向?qū)ο罅?
先看看Kotlin中的類長(zhǎng)什么樣吧.

可以看到Kotlin中的類還是很普通的,大多與Java相似,比較特殊的有:
每一個(gè)構(gòu)造函數(shù)都必須為每一個(gè)成員變量賦予初值.
primary constructor,這個(gè)構(gòu)造函數(shù)的頭部緊跟在類名之后,函數(shù)體卻在類中,是由init關(guān)鍵字包含的一個(gè)代碼塊,這種函數(shù)頭和函數(shù)體分開(kāi)的寫(xiě)法還是很少有的,其實(shí)這兩個(gè)部分會(huì)被整合成一個(gè)構(gòu)造函數(shù),使用jd-gui反編譯class文件可以看到如下最終生成的那一個(gè)構(gòu)造函數(shù):

在Kotlin中這是一個(gè)特殊的構(gòu)造函數(shù),只能定義一個(gè)而且一旦其被定義,則其他構(gòu)造函數(shù)都必須調(diào)用它.
等等,好像有什么不對(duì),這個(gè)構(gòu)造函數(shù)最前面好像有兩句代碼,其實(shí)這兩句代碼是寫(xiě)在成員變量的初始化值那里,最后編譯器將其塞到了init塊的起始處.如果沒(méi)有定義init塊的話,成員變量初始值代碼會(huì)被任何一個(gè)構(gòu)造函數(shù)首先執(zhí)行.
接下來(lái)我們看看其他的構(gòu)造函數(shù),在構(gòu)造函數(shù)頭部使用this調(diào)用其他構(gòu)造函數(shù),這里我們看到了一個(gè)沒(méi)有函數(shù)體的構(gòu)造函數(shù),編譯運(yùn)行都沒(méi)有錯(cuò),其實(shí)這個(gè)函數(shù)就只有一句代碼,調(diào)用了其他構(gòu)造函數(shù)而已.
在這里我們看到了一個(gè)關(guān)鍵字open,open關(guān)鍵字可以用來(lái)允許一個(gè)類被繼承,沒(méi)錯(cuò),不寫(xiě)open的話類默認(rèn)是final的,不能被繼承.
而且同樣函數(shù)默認(rèn)也是final的,不能被override,要想重寫(xiě)父類函數(shù),父類函數(shù)必須使用open定義.
不僅如此,在Kotlin中,函數(shù)參數(shù)默認(rèn)也都是final的.
接下來(lái)看看繼承吧,我們?yōu)檫@個(gè)類定義一個(gè)子類.

子類不會(huì)繼承父類的構(gòu)造函數(shù),在子類中可以使用super關(guān)鍵字調(diào)用父類函數(shù),使用override重寫(xiě)父類函數(shù),重寫(xiě)父類函數(shù)不可以降低函數(shù)可視性.
剛才我們說(shuō)了,每一個(gè)構(gòu)造函數(shù)都必須為每一個(gè)成員變量賦予初值,讓我們來(lái)搞一些破壞,我們?cè)趖his.z被初始化之前調(diào)用show方法,show方法需要訪問(wèn)this.z字段,而this.z現(xiàn)在還沒(méi)有初始化,那么會(huì)發(fā)生什么呢?讓我們測(cè)試一下.

運(yùn)行結(jié)果如下:

可以看到最后輸出表示z=0,說(shuō)明z被編譯器自動(dòng)默認(rèn)初始化為0了,然而編譯器不可能總是為你解決這些問(wèn)題,假設(shè)我們的問(wèn)題復(fù)雜一些,待會(huì)兒再討論.:-)
然后是多態(tài),讓我們定義一個(gè)父類和兩個(gè)子類:



我們各自重寫(xiě)了toString函數(shù),最后調(diào)用其show方法

這兩個(gè)變量都是包含在一個(gè)Shape3D的類型中的,我們看看運(yùn)行結(jié)果吧

可以看到多態(tài)的實(shí)現(xiàn).
現(xiàn)在讓我們來(lái)做一些惡作劇,我們之前說(shuō)過(guò),如果在成員變量還沒(méi)有初始化時(shí)就訪問(wèn),編譯器會(huì)自動(dòng)賦予一個(gè)默認(rèn)的初值給成員變量,現(xiàn)在我們把Triangle3D的構(gòu)造函數(shù)改一下,變成這個(gè)樣子:

在this.c還沒(méi)有初始化的時(shí)候調(diào)用show函數(shù):

運(yùn)行結(jié)果如下:

結(jié)果發(fā)生異常了,說(shuō)明編譯器并不總能為你的成員變量賦予一個(gè)默認(rèn)的初值.對(duì)于復(fù)雜的對(duì)象,編譯器也愛(ài)莫能助.
所以我們最好謹(jǐn)慎的處理這些細(xì)節(jié),減少對(duì)編譯器特定行為的依賴.
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
-
Java注冊(cè)郵箱激活驗(yàn)證實(shí)現(xiàn)代碼
這篇文章主要介紹了Java注冊(cè)郵箱激活驗(yàn)證實(shí)現(xiàn)代碼,有需要的朋友可以參考一下 2013-12-12
-
java獲取當(dāng)前時(shí)間并格式化代碼實(shí)例
這篇文章主要介紹了java獲取當(dāng)前時(shí)間并格式化代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下 2019-08-08
-
SpringSecurity的防Csrf攻擊實(shí)現(xiàn)代碼解析
這篇文章主要介紹了SpringSecurity的防Csrf攻擊實(shí)現(xiàn)代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下 2020-03-03
-
MyBatis-Plus中MetaObjectHandler沒(méi)生效完美解決
在進(jìn)行測(cè)試時(shí)發(fā)現(xiàn)配置的MyMetaObjectHandler并沒(méi)有生效,本文主要介紹了MyBatis-Plus中MetaObjectHandler沒(méi)生效完美解決,具有一定的參考價(jià)值,感興趣的可以了解一下 2023-11-11
-
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(11)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你 2021-07-07
-
SpringBoot整合Redis實(shí)現(xiàn)訪問(wèn)量統(tǒng)計(jì)的示例代碼
本文主要介紹了SpringBoot整合Redis實(shí)現(xiàn)訪問(wèn)量統(tǒng)計(jì)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2022-02-02
-
詳解SpringBoot通用配置文件(不定時(shí)更新)
這篇文章主要介紹了SpringBoot通用配置文件詳解(不定時(shí)更新),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下 2021-03-03
最新評(píng)論
Kotlin 面向?qū)ο?/strong>
這幾天一直在準(zhǔn)備考試,實(shí)在沒(méi)有時(shí)間,已經(jīng)過(guò)去了這么久,終于要到面向?qū)ο罅?
先看看Kotlin中的類長(zhǎng)什么樣吧.
可以看到Kotlin中的類還是很普通的,大多與Java相似,比較特殊的有:
每一個(gè)構(gòu)造函數(shù)都必須為每一個(gè)成員變量賦予初值.
primary constructor,這個(gè)構(gòu)造函數(shù)的頭部緊跟在類名之后,函數(shù)體卻在類中,是由init關(guān)鍵字包含的一個(gè)代碼塊,這種函數(shù)頭和函數(shù)體分開(kāi)的寫(xiě)法還是很少有的,其實(shí)這兩個(gè)部分會(huì)被整合成一個(gè)構(gòu)造函數(shù),使用jd-gui反編譯class文件可以看到如下最終生成的那一個(gè)構(gòu)造函數(shù):
在Kotlin中這是一個(gè)特殊的構(gòu)造函數(shù),只能定義一個(gè)而且一旦其被定義,則其他構(gòu)造函數(shù)都必須調(diào)用它.
等等,好像有什么不對(duì),這個(gè)構(gòu)造函數(shù)最前面好像有兩句代碼,其實(shí)這兩句代碼是寫(xiě)在成員變量的初始化值那里,最后編譯器將其塞到了init塊的起始處.如果沒(méi)有定義init塊的話,成員變量初始值代碼會(huì)被任何一個(gè)構(gòu)造函數(shù)首先執(zhí)行.
接下來(lái)我們看看其他的構(gòu)造函數(shù),在構(gòu)造函數(shù)頭部使用this調(diào)用其他構(gòu)造函數(shù),這里我們看到了一個(gè)沒(méi)有函數(shù)體的構(gòu)造函數(shù),編譯運(yùn)行都沒(méi)有錯(cuò),其實(shí)這個(gè)函數(shù)就只有一句代碼,調(diào)用了其他構(gòu)造函數(shù)而已.
在這里我們看到了一個(gè)關(guān)鍵字open,open關(guān)鍵字可以用來(lái)允許一個(gè)類被繼承,沒(méi)錯(cuò),不寫(xiě)open的話類默認(rèn)是final的,不能被繼承.
而且同樣函數(shù)默認(rèn)也是final的,不能被override,要想重寫(xiě)父類函數(shù),父類函數(shù)必須使用open定義.
不僅如此,在Kotlin中,函數(shù)參數(shù)默認(rèn)也都是final的.
接下來(lái)看看繼承吧,我們?yōu)檫@個(gè)類定義一個(gè)子類.
子類不會(huì)繼承父類的構(gòu)造函數(shù),在子類中可以使用super關(guān)鍵字調(diào)用父類函數(shù),使用override重寫(xiě)父類函數(shù),重寫(xiě)父類函數(shù)不可以降低函數(shù)可視性.
剛才我們說(shuō)了,每一個(gè)構(gòu)造函數(shù)都必須為每一個(gè)成員變量賦予初值,讓我們來(lái)搞一些破壞,我們?cè)趖his.z被初始化之前調(diào)用show方法,show方法需要訪問(wèn)this.z字段,而this.z現(xiàn)在還沒(méi)有初始化,那么會(huì)發(fā)生什么呢?讓我們測(cè)試一下.
運(yùn)行結(jié)果如下:
可以看到最后輸出表示z=0,說(shuō)明z被編譯器自動(dòng)默認(rèn)初始化為0了,然而編譯器不可能總是為你解決這些問(wèn)題,假設(shè)我們的問(wèn)題復(fù)雜一些,待會(huì)兒再討論.:-)
然后是多態(tài),讓我們定義一個(gè)父類和兩個(gè)子類:
我們各自重寫(xiě)了toString函數(shù),最后調(diào)用其show方法
這兩個(gè)變量都是包含在一個(gè)Shape3D的類型中的,我們看看運(yùn)行結(jié)果吧
可以看到多態(tài)的實(shí)現(xiàn).
現(xiàn)在讓我們來(lái)做一些惡作劇,我們之前說(shuō)過(guò),如果在成員變量還沒(méi)有初始化時(shí)就訪問(wèn),編譯器會(huì)自動(dòng)賦予一個(gè)默認(rèn)的初值給成員變量,現(xiàn)在我們把Triangle3D的構(gòu)造函數(shù)改一下,變成這個(gè)樣子:
在this.c還沒(méi)有初始化的時(shí)候調(diào)用show函數(shù):
運(yùn)行結(jié)果如下:
結(jié)果發(fā)生異常了,說(shuō)明編譯器并不總能為你的成員變量賦予一個(gè)默認(rèn)的初值.對(duì)于復(fù)雜的對(duì)象,編譯器也愛(ài)莫能助.
所以我們最好謹(jǐn)慎的處理這些細(xì)節(jié),減少對(duì)編譯器特定行為的依賴.
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Java注冊(cè)郵箱激活驗(yàn)證實(shí)現(xiàn)代碼
這篇文章主要介紹了Java注冊(cè)郵箱激活驗(yàn)證實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2013-12-12java獲取當(dāng)前時(shí)間并格式化代碼實(shí)例
這篇文章主要介紹了java獲取當(dāng)前時(shí)間并格式化代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08SpringSecurity的防Csrf攻擊實(shí)現(xiàn)代碼解析
這篇文章主要介紹了SpringSecurity的防Csrf攻擊實(shí)現(xiàn)代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03MyBatis-Plus中MetaObjectHandler沒(méi)生效完美解決
在進(jìn)行測(cè)試時(shí)發(fā)現(xiàn)配置的MyMetaObjectHandler并沒(méi)有生效,本文主要介紹了MyBatis-Plus中MetaObjectHandler沒(méi)生效完美解決,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(11)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07SpringBoot整合Redis實(shí)現(xiàn)訪問(wèn)量統(tǒng)計(jì)的示例代碼
本文主要介紹了SpringBoot整合Redis實(shí)現(xiàn)訪問(wèn)量統(tǒng)計(jì)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02詳解SpringBoot通用配置文件(不定時(shí)更新)
這篇文章主要介紹了SpringBoot通用配置文件詳解(不定時(shí)更新),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03