天天看點

Kotlin學習(四)—— 類和對象,繼承,覆寫,抽象類,屬性和字段,接口,可見性修飾符,擴充

Kotlin和java的類的聲明都是一樣的,用class表示,比如

如果是空類的話,大括号都可以省了

一個主構造函數和多個次要函數,主函數在類名後,如

如果主構造函數沒有任何注解或者可⻅性修飾符,可以省略這個 constructor 關鍵字。

并且主構造函數不允許任何代碼,初始化的代碼可以放在init塊中

我們再來看下次構造函數

類也可以聲明字首有 constructor的次構造函數:

Kotlin中沒有new,是以直接調用

所有的類都有一個超類Any,有點類似于JAVA中的Object,但是他們确是不同的,隻是概念相似而已,因為Any隻有有數的幾個方法

這裡我們定義一個基類BaseClass

這裡的open,是公開的意思,和JAVA中的final完全相反

那我們再定義一個類去繼承基類

當然,括号都是可以取消的

如果類沒有主構造函數,那麼每個次構造函數必須使⽤ super 關鍵字初始化其基類型,比如我們Android中的使用

這個很好了解,有繼承就可以覆寫,我們來看一段代碼

這裡有一個被open修飾的Base,裡面有個Base方法,裡面有列印,我現在有一個Son類,繼承Base,并且override修飾重寫v方法,再列印,那我的main方法,執行個體化這個對象後調用,列印的就是Son…了

Kotlin學習(四)—— 類和對象,繼承,覆寫,抽象類,屬性和字段,接口,可見性修飾符,擴充

标記為 override 的成員本⾝是開放的,也就是說,它可以在子類中覆寫,如果不想再次被覆寫,可以再修飾一個final

上面提到的是方法的覆寫,我們還可以覆寫屬性,但是也是同樣的,需要override修飾,比如

在這段代碼中,我們可以看到在基類中定義了一個屬性a,然後子類中覆寫了一個a,輸出的就是子類的a值了

如果我們想用到父類的方法,可以使用super

如果你是砸死内部類中想使用,那麼需要[email protected]()

在 Kotlin 中,實作繼承由下述規則規定:如果⼀個類從它的直接超類繼承相同成員的多個實作,它必須覆寫這個成員并提供其⾃⼰的實作(也許⽤繼承來

的其中之⼀)。為了表⽰采⽤從哪個超類型繼承的實作,我們使⽤由尖括号中超類型名限定的 super,如 super :

這裡的open可以不聲明,并且我們可以一個抽象成員覆寫一個非抽象的開放成員,如例子

我相信大家對屬性應該是比較了解的,我們在第二篇的時候也已經說過

想要調用的話

在kt中,get和set就比較有意思了,正确的文法是:

如下代碼

我就定義了a的get和set

kt的接口的關鍵字interface,比如

如果你想實作一個接口,你可以

你也可以在接口中定義一些屬性,但是必須是抽象的或者對外提供通路的

kt中有四種可見性修飾符,private 、protected 、internal 和 public,預設是public

public 随處可見

private 聲明他的檔案中可見

internal 相同子產品可見

protected 不适用于頂層聲明

這裡還有一點需要注意的是,在JAVA中我們private中修飾的變量最終可以通過set/get的方式去通路,但是在kt中,外部類是不能通路内部類修飾的private成員

擴充,擴充一個類或者對象的新功能無需繼承該類或使⽤像裝飾者這樣的任何類型的設計模式

聲明一個擴充函數,我們需要一個接收者類型 也就是被擴充的類型來作為他的字首,來看代碼:

這裡就看的很清晰了,一個List本來沒有open的方法,我通過擴充就給他加上了,并且内部實作了輸出想加的結果

當然,我們并不會局限于哪些類型,是以通過泛型去裝飾一下

<a href="https://github.com/LiuGuiLinAndroid/Kotlin" target="_blank">Kotlin</a>

Kotlin學習(四)—— 類和對象,繼承,覆寫,抽象類,屬性和字段,接口,可見性修飾符,擴充

繼續閱讀