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

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

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

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

運行結果如下:

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



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

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

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

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

運行結果如下:

結果發(fā)生異常了,說明編譯器并不總能為你的成員變量賦予一個默認的初值.對于復雜的對象,編譯器也愛莫能助.
所以我們最好謹慎的處理這些細節(jié),減少對編譯器特定行為的依賴.
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
-
Spring Date jpa 獲取最新一條數(shù)據(jù)的實例代碼
這篇文章主要介紹了Spring Date jpa 獲取最新一條數(shù)據(jù)的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 2020-10-10
-
java socket實現(xiàn)聊天室 java實現(xiàn)多人聊天功能
這篇文章主要為大家詳細介紹了java socket實現(xiàn)聊天室,java實現(xiàn)多人聊天功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下 2018-07-07
-
Java將Exception信息轉(zhuǎn)為String字符串的方法
今天小編就為大家分享一篇Java將Exception信息轉(zhuǎn)為String字符串的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 2018-10-10
-
Java 自定義Spring框架與Spring IoC相關接口分析
Spring框架是由于軟件開發(fā)的復雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務器端的開發(fā) 2021-10-10
-
Java 實戰(zhàn)練手項目之校園超市管理系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+Mysql+Maven+Bootstrap實現(xiàn)一個校園超市管理系統(tǒng),大家可以在過程中查缺補漏,提升水平 2021-11-11
最新評論
Kotlin 面向?qū)ο?/strong>
這幾天一直在準備考試,實在沒有時間,已經(jīng)過去了這么久,終于要到面向?qū)ο罅?
先看看Kotlin中的類長什么樣吧.

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

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

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

運行結果如下:

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



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

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

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

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

運行結果如下:

結果發(fā)生異常了,說明編譯器并不總能為你的成員變量賦予一個默認的初值.對于復雜的對象,編譯器也愛莫能助.
所以我們最好謹慎的處理這些細節(jié),減少對編譯器特定行為的依賴.
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
Spring Date jpa 獲取最新一條數(shù)據(jù)的實例代碼
這篇文章主要介紹了Spring Date jpa 獲取最新一條數(shù)據(jù)的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
java socket實現(xiàn)聊天室 java實現(xiàn)多人聊天功能
這篇文章主要為大家詳細介紹了java socket實現(xiàn)聊天室,java實現(xiàn)多人聊天功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
Java將Exception信息轉(zhuǎn)為String字符串的方法
今天小編就為大家分享一篇Java將Exception信息轉(zhuǎn)為String字符串的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
Java 自定義Spring框架與Spring IoC相關接口分析
Spring框架是由于軟件開發(fā)的復雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務器端的開發(fā)2021-10-10
Java 實戰(zhàn)練手項目之校園超市管理系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+Mysql+Maven+Bootstrap實現(xiàn)一個校園超市管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11

