(新) Kotlin搞起來 —— 4.類與對象
標籤: Kotlin
本文聲明:
本文由Coder-pig編寫,想瞭解其他內容,可見【Coder-Pig的豬欄】
尊重作者勞動成果,未經本人授權,禁止轉載。違者必究。
《Kotlin搞起來》系列目錄位址:http://blog.csdn.net/coder_pig/article/details/72851862 1.Any類
我們都知道Java中每個類都有一個Object的預設父類,在Kotlin中也有,但是不是Object,
而是 Any 類,雖說都是所有類的共同父類,但是類組成卻是不一樣的,對比下就知道了:
2.類定義與對象執行個體化
Kotlin中不同於Java,允許在一個檔案中定義多個類,另外,類實體是可選的,就是直接
class Test 這樣,對的不用疑惑,可以不寫大括弧,當然這個一般用於表示概念(沒什麼
卵用)。而執行個體化類對象以及調用成員方法也很簡單:
這裡設定對象的屬性**Name,其實是調用了自動產生的**setName()方法,對了,你
還可以自訂屬性的getter和setter方法,做一些過濾或者一些附加操作,例如:
然後這裡有個坑,就是如果你寫成get() = trueHeight,會不停調用自身,然後OOM。
網上有人說在前面加個$,但實測不行,如果有解決方案的務必告知我。
另外,你還可以再get和set方法前加 private,這樣可以禁止外部調用。 3.構造器(構造方法)
Kotlin中的構造器分為三種: 主構造器
規矩如下: 1.如果一個非抽象類別沒有聲明任何主次構造器,那麼會預設產生一個public 無參的主構造器。 2.一個類只有一個主構造器,類頭部的一部分,在類名後,constructor(參數列表), 3.主構造器中不能包含任何代碼,如果想寫一些初始化代碼,可以寫到init初始化代碼塊中。
使用樣本如下:
輔助構造器
規矩如下: 1.寫在類中,可以有一個或者多個,用constructor關鍵字標識。 2.可以通過this()調用其他輔助構造器,但是任何一個輔助構造器都必須調用主構造器。
使用樣本如下:
私人主構造器
其實就是在主構造器前加上一個private,然後就只能通過輔助構造器來執行個體化對象
使用樣本如下:
4.繼承
上一節常識那裡也說了,Kotlin中繼承父類或者實現介面,直接用 : 引號,如果有多個
可以用,逗號隔開;另外上一節看對應的Java代碼我們知道了類的預設修飾符是: public final,
意味著這個類是不能改變的,如果你想進行一些重寫的話,你需要在class前添加一個 open 關鍵字,
子類構造方法需要實現父類構造方法,而方法的修飾符也是final的,重寫某個方法,同樣需要在
方法前加上open關鍵字,而且重寫的方法前還需加上override關鍵字;還有,你可以用 super
關鍵字來調用父類中的方法,這一點和Java中是一樣的。
使用樣本如下:
5.介面
Kotlin中的介面類似於Java8,支援抽象方法,抽象屬性,還支援包含實現的方法
介面與其中的方法預設是 open 的和Java一樣使用 interface 聲明。
介面與抽象類別的區別在於:介面不能儲存狀態資料,可以擁有屬性,但是這些屬性必須
是抽象的,或者提供訪問器的自訂實現。
使用樣本如下:
另外,如果一個需要實現的類或介面中包含同名方法,可以使用<>來指明調用的是哪個
父類方法。比如:
6.抽象類別
和介面類似,預設是open的,但是對於抽象成員,需要使用 abstract 關鍵字聲明。
使用樣本如下:
7.內部類,匿名內部類的建立
類可以嵌套在其他類中,如果只是簡單的嵌套,內部類是無法訪問外部類成員的。
如果你想在內部類中訪問外部成員,你需要使用 inner 關鍵字進行聲明。
使用樣本如下:
另外匿名內部類,Kotlin中會自動轉成lambda運算式的形式,比如設定點擊事件:
Java中:
Kotlin中:
因為OnClickListener匿名內部類中只有一個onclick方法,可以省略,如果是有
多個方法需要重寫的匿名內部類,則要使用object關鍵字了,例子如下:
8.單例對象
Kotlin中 沒有靜態屬性和方法,如果你想實現類似於單例的功能,
你可以使用關鍵字 object 聲明一個對象,對象的構造器不能提供構造器參數,
在第一次使用的時候會被初始化,可用於提供常量或共用不可變對象。
使用樣本如下:
9.伴生對象
除了上面的單例對象外,Kotlin 中還提供了伴生對象這種東西,使用 companion關鍵字聲明,
可以直接 類.成員 訪問成員,有點類似與靜態成員,但是在運行時,他們依舊是實體的執行個體成員,
另外,使用companion關鍵字時,伴生對象的名稱可以省略。
使用樣本如下:
當然可能有一些強迫症患者硬是要用靜態成員和靜態方法的話,你可以用下述關鍵字:
靜態成員: @JvmField 註解:產生與該屬性相同的靜態欄位 lateinit 關鍵字:延遲初始化,上一節定義空變數講了~ const 關鍵字:將 Kotlin 屬性轉換成 Java 中的靜態欄位(定義常量用)
靜態方法: @JvmStatic 註解:在單例對象和伴生對象中產生對應的靜態方法
使用樣本如下:
10.資料類
就是只表示資料的類,用 data 進行聲明,預設基於構造方法中實現了:
toString(), componentN(), copy(), equals() 和 hashCode() 方法,
另外,不在構造方法中定義的屬性不會產生在toString()的結果中。
Data類可以直接使用 == 進行比較。
使用樣本如下:
11.枚舉類
Kotlin中的枚舉與Java中基本類似,用 enum 聲明為枚舉類
最基本的用法是實作類別型安全的枚舉,比如,要你表示周一到周日,大部人會使用1-7,
如果出現了異常情況,使用者輸入了0或者8,枚舉可以看做對輸入的資料類型做了限制
只能是枚舉中的某一個,從而實現了所謂的型別安全。
使用樣本如下:
輸出:
除此之外,你還可以通過valueOf(“名字”)類匹配或者values()拿到一個Array,
然後進行遍曆~ 12.封閉類
用於限制類的階層,值只能是集合中的類型,不可以是其他任何類型,
可以理解成 “擴充的枚舉類“,但與枚舉有些不同:
枚舉中的執行個體是唯一的,而封閉類可以有很多執行個體,他們可以有不同的狀態,
使用關鍵字 sealed 聲明(內部的類都是本身的子類)另外該關鍵字不能修飾介面或抽象類別,會報
waring,但不會出現編譯錯誤。另外有一點要區分:
直接子類必須都寫在封閉類中。。。 封閉類子類的擴充可以在任何地方,而無需在同一個檔案中。
使用密封類的最主要的的好處體現在你使用 when 運算式,可以確保聲明可以覆蓋到所有的情形,不需要再使用
else 情形。
PS:在Kotlin 1.1中允許使用data資料類繼承。
使用樣本如下: