欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Kotlin基礎(chǔ)教程之面向?qū)ο?/h1>
 更新時間:2017年05月27日 10:24:16   作者:天命劍主  
這篇文章主要介紹了Kotlin基礎(chǔ)教程之面向?qū)ο蟮南嚓P(guān)資料,需要的朋友可以參考下

Kotlin 面向?qū)ο?/strong>

這幾天一直在準備考試,實在沒有時間,已經(jīng)過去了這么久,終于要到面向?qū)ο罅?

先看看Kotlin中的類長什么樣吧.


可以看到Kotlin中的類還是很普通的,大多與Java相似,比較特殊的有:

每一個構(gòu)造函數(shù)都必須為每一個成員變量賦予初值.

primary constructor,這個構(gòu)造函數(shù)的頭部緊跟在類名之后,函數(shù)體卻在類中,是由init關(guān)鍵字包含的一個代碼塊,這種函數(shù)頭和函數(shù)體分開的寫法還是很少有的,其實這兩個部分會被整合成一個構(gòu)造函數(shù),使用jd-gui反編譯class文件可以看到如下最終生成的那一個構(gòu)造函數(shù):

在Kotlin中這是一個特殊的構(gòu)造函數(shù),只能定義一個而且一旦其被定義,則其他構(gòu)造函數(shù)都必須調(diào)用它.

等等,好像有什么不對,這個構(gòu)造函數(shù)最前面好像有兩句代碼,其實這兩句代碼是寫在成員變量的初始化值那里,最后編譯器將其塞到了init塊的起始處.如果沒有定義init塊的話,成員變量初始值代碼會被任何一個構(gòu)造函數(shù)首先執(zhí)行.

接下來我們看看其他的構(gòu)造函數(shù),在構(gòu)造函數(shù)頭部使用this調(diào)用其他構(gòu)造函數(shù),這里我們看到了一個沒有函數(shù)體的構(gòu)造函數(shù),編譯運行都沒有錯,其實這個函數(shù)就只有一句代碼,調(diào)用了其他構(gòu)造函數(shù)而已.

在這里我們看到了一個關(guān)鍵字open,open關(guān)鍵字可以用來允許一個類被繼承,沒錯,不寫open的話類默認是final的,不能被繼承.

而且同樣函數(shù)默認也是final的,不能被override,要想重寫父類函數(shù),父類函數(shù)必須使用open定義.

不僅如此,在Kotlin中,函數(shù)參數(shù)默認也都是final的.

接下來看看繼承吧,我們?yōu)檫@個類定義一個子類.


子類不會繼承父類的構(gòu)造函數(shù),在子類中可以使用super關(guān)鍵字調(diào)用父類函數(shù),使用override重寫父類函數(shù),重寫父類函數(shù)不可以降低函數(shù)可視性.

剛才我們說了,每一個構(gòu)造函數(shù)都必須為每一個成員變量賦予初值,讓我們來搞一些破壞,我們在this.z被初始化之前調(diào)用show方法,show方法需要訪問this.z字段,而this.z現(xiàn)在還沒有初始化,那么會發(fā)生什么呢?讓我們測試一下.


運行結(jié)果如下:


可以看到最后輸出表示z=0,說明z被編譯器自動默認初始化為0了,然而編譯器不可能總是為你解決這些問題,假設(shè)我們的問題復(fù)雜一些,待會兒再討論.:-)

然后是多態(tài),讓我們定義一個父類和兩個子類:


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


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


可以看到多態(tài)的實現(xiàn).

現(xiàn)在讓我們來做一些惡作劇,我們之前說過,如果在成員變量還沒有初始化時就訪問,編譯器會自動賦予一個默認的初值給成員變量,現(xiàn)在我們把Triangle3D的構(gòu)造函數(shù)改一下,變成這個樣子:


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


運行結(jié)果如下:


結(jié)果發(fā)生異常了,說明編譯器并不總能為你的成員變量賦予一個默認的初值.對于復(fù)雜的對象,編譯器也愛莫能助.

所以我們最好謹慎的處理這些細節(jié),減少對編譯器特定行為的依賴.

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • JVM內(nèi)存增強之逃逸分析

    JVM內(nèi)存增強之逃逸分析

    逃逸分析一種數(shù)據(jù)分析算法,基于此算法可以有效減少Java對象在堆內(nèi)存中的分配。本文將詳細講講逃逸分析的原理與實現(xiàn),需要的可以參考一下
    2022-09-09
  • Java volatile關(guān)鍵字特性講解上篇

    Java volatile關(guān)鍵字特性講解上篇

    JMM要求保證可見性、原子性、有序性,volatile可以保證其中的兩個,本篇文章具體驗證volatile的可見性,不原子性和禁重排,同時解決volatile的不保證原子性,讓代碼具有原子性
    2022-12-12
  • Java注冊郵箱激活驗證實現(xiàn)代碼

    Java注冊郵箱激活驗證實現(xiàn)代碼

    這篇文章主要介紹了Java注冊郵箱激活驗證實現(xiàn)代碼,有需要的朋友可以參考一下
    2013-12-12
  • java獲取當前時間并格式化代碼實例

    java獲取當前時間并格式化代碼實例

    這篇文章主要介紹了java獲取當前時間并格式化代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • SpringSecurity的防Csrf攻擊實現(xiàn)代碼解析

    SpringSecurity的防Csrf攻擊實現(xiàn)代碼解析

    這篇文章主要介紹了SpringSecurity的防Csrf攻擊實現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • MyBatis-Plus中MetaObjectHandler沒生效完美解決

    MyBatis-Plus中MetaObjectHandler沒生效完美解決

    在進行測試時發(fā)現(xiàn)配置的MyMetaObjectHandler并沒有生效,本文主要介紹了MyBatis-Plus中MetaObjectHandler沒生效完美解決,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Java日常練習題,每天進步一點點(11)

    Java日常練習題,每天進步一點點(11)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • SpringBoot整合Redis實現(xiàn)訪問量統(tǒng)計的示例代碼

    SpringBoot整合Redis實現(xiàn)訪問量統(tǒng)計的示例代碼

    本文主要介紹了SpringBoot整合Redis實現(xiàn)訪問量統(tǒng)計的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 詳解SpringBoot通用配置文件(不定時更新)

    詳解SpringBoot通用配置文件(不定時更新)

    這篇文章主要介紹了SpringBoot通用配置文件詳解(不定時更新),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java map存放數(shù)組并取出值代碼詳解

    Java map存放數(shù)組并取出值代碼詳解

    這篇文章主要介紹了Java map存放數(shù)組并取出值代碼詳解的相關(guān)內(nèi)容,小編覺得挺不錯的,這里給大家分享一下,需要的朋友可以參考。
    2017-10-10

最新評論