標簽: Kotlin
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數據類繼承!
使用示例如下:


