標(biāo)簽: Kotlin
1.Any類(lèi)
我們都知道Java中每個(gè)類(lèi)都有一個(gè)Object的默認(rèn)父類(lèi),在Kotlin中也有叛薯,但是不是Object浑吟,
而是 Any 類(lèi)笙纤,雖說(shuō)都是所有類(lèi)的共同父類(lèi),但是類(lèi)組成卻是不一樣的组力,對(duì)比下就知道了:
2.類(lèi)定義與對(duì)象實(shí)例化
Kotlin中不同于Java省容,允許在一個(gè)文件中定義多個(gè)類(lèi),另外燎字,類(lèi)實(shí)體是可選的腥椒,就是直接
class Test 這樣,對(duì)的不用疑惑候衍,可以不寫(xiě)大括號(hào)笼蛛,當(dāng)然這個(gè)一般用于表示概念(沒(méi)什么
卵用)。而實(shí)例化類(lèi)對(duì)象以及調(diào)用成員方法也很簡(jiǎn)單:
這里設(shè)置對(duì)象的屬性Name蛉鹿,其實(shí)是調(diào)用了自動(dòng)生成的setName()方法滨砍,對(duì)了,你
還可以自定義屬性的getter和setter方法榨为,做一些過(guò)濾或者一些附加操作惨好,例如:
然后這里有個(gè)坑,就是如果你寫(xiě)成get() = trueHeight随闺,會(huì)不停調(diào)用自身日川,然后OOM!
網(wǎng)上有人說(shuō)在前面加個(gè)$矩乐,但實(shí)測(cè)不行龄句,如果有解決方案的務(wù)必告知我!
另外散罕,你還可以再get和set方法前加 private分歇,這樣可以禁止外部調(diào)用!
3.構(gòu)造器(構(gòu)造方法)
Kotlin中的構(gòu)造器分為三種:
主構(gòu)造器
規(guī)矩如下:
- 1.如果一個(gè)非抽象類(lèi)沒(méi)有聲明任何主次構(gòu)造器欧漱,那么會(huì)默認(rèn)生成一個(gè)public 無(wú)參的主構(gòu)造器职抡!
- 2.一個(gè)類(lèi)只有一個(gè)主構(gòu)造器,類(lèi)頭部的一部分误甚,在類(lèi)名后缚甩,constructor(參數(shù)列表),
- 3.主構(gòu)造器中不能包含任何代碼窑邦,如果想寫(xiě)一些初始化代碼擅威,可以寫(xiě)到init初始化代碼塊中!
?
使用示例如下:
輔助構(gòu)造器
規(guī)矩如下:
- 1.寫(xiě)在類(lèi)中冈钦,可以有一個(gè)或者多個(gè)郊丛,用constructor關(guān)鍵字標(biāo)識(shí)!
- 2.可以通過(guò)this()調(diào)用其他輔助構(gòu)造器,但是任何一個(gè)輔助構(gòu)造器都必須調(diào)用主構(gòu)造器厉熟!
?
使用示例如下:
私有主構(gòu)造器
其實(shí)就是在主構(gòu)造器前加上一個(gè)private导盅,然后就只能通過(guò)輔助構(gòu)造器來(lái)實(shí)例化對(duì)象
使用示例如下:
4.繼承
上一節(jié)常識(shí)那里也說(shuō)了,Kotlin中繼承父類(lèi)或者實(shí)現(xiàn)接口庆猫,直接用 : 引號(hào)认轨,如果有多個(gè)
可以用,逗號(hào)隔開(kāi)月培;另外上一節(jié)看對(duì)應(yīng)的Java代碼我們知道了類(lèi)的默認(rèn)修飾符是: public final嘁字,
意味著這個(gè)類(lèi)是不能改變的,如果你想進(jìn)行一些重寫(xiě)的話杉畜,你需要在class前添加一個(gè) open 關(guān)鍵字纪蜒,
子類(lèi)構(gòu)造方法需要實(shí)現(xiàn)父類(lèi)構(gòu)造方法,而方法的修飾符也是final的此叠,重寫(xiě)某個(gè)方法纯续,同樣需要在
方法前加上open關(guān)鍵字,而且重寫(xiě)的方法前還需加上override關(guān)鍵字灭袁;還有猬错,你可以用 super
關(guān)鍵字來(lái)調(diào)用父類(lèi)中的方法,這一點(diǎn)和Java中是一樣的茸歧。
使用示例如下:
5.接口
Kotlin中的接口類(lèi)似于Java8倦炒,支持抽象方法,抽象屬性软瞎,還支持包含實(shí)現(xiàn)的方法
接口與其中的方法默認(rèn)是 open 的和Java一樣使用 interface 聲明逢唤!
接口與抽象類(lèi)的區(qū)別在于:接口不能存儲(chǔ)狀態(tài)數(shù)據(jù),可以擁有屬性涤浇,但是這些屬性必須
是抽象的鳖藕,或者提供訪問(wèn)器的自定義實(shí)現(xiàn)!
使用示例如下:
另外只锭,如果一個(gè)需要實(shí)現(xiàn)的類(lèi)或接口中包含同名方法著恩,可以使用<>來(lái)指明調(diào)用的是哪個(gè)
父類(lèi)方法!比如:
6.抽象類(lèi)
和接口類(lèi)似蜻展,默認(rèn)是open的喉誊,但是對(duì)于抽象成員,需要使用 abstract 關(guān)鍵字聲明铺呵!
使用示例如下:
7.內(nèi)部類(lèi),匿名內(nèi)部類(lèi)的創(chuàng)建
類(lèi)可以嵌套在其他類(lèi)中隧熙,如果只是簡(jiǎn)單的嵌套片挂,內(nèi)部類(lèi)是無(wú)法訪問(wèn)外部類(lèi)成員的!
如果你想在內(nèi)部類(lèi)中訪問(wèn)外部成員,你需要使用 inner 關(guān)鍵字進(jìn)行聲明音念。
使用示例如下:
另外匿名內(nèi)部類(lèi)沪饺,Kotlin中會(huì)自動(dòng)轉(zhuǎn)成lambda表達(dá)式的形式,比如設(shè)置點(diǎn)擊事件:
Java中:
Kotlin中:
因?yàn)镺nClickListener匿名內(nèi)部類(lèi)中只有一個(gè)onclick方法闷愤,可以省略整葡,如果是有
多個(gè)方法需要重寫(xiě)的匿名內(nèi)部類(lèi),則要使用object關(guān)鍵字了讥脐,例子如下:
8.單例對(duì)象
Kotlin中 沒(méi)有靜態(tài)屬性和方法遭居,如果你想實(shí)現(xiàn)類(lèi)似于單例的功能,
你可以使用關(guān)鍵字 object 聲明一個(gè)對(duì)象旬渠,對(duì)象的構(gòu)造器不能提供構(gòu)造器參數(shù)俱萍,
在第一次使用的時(shí)候會(huì)被初始化,可用于提供常量或共享不可變對(duì)象告丢!
使用示例如下:
9.伴生對(duì)象
除了上面的單例對(duì)象外枪蘑,Kotlin 中還提供了伴生對(duì)象這種東西,使用 companion關(guān)鍵字聲明岖免,
可以直接 類(lèi).成員 訪問(wèn)成員岳颇,有點(diǎn)類(lèi)似與靜態(tài)成員,但是在運(yùn)行時(shí)颅湘,他們依舊是實(shí)體的實(shí)例成員话侧,
另外,使用companion關(guān)鍵字時(shí)栅炒,伴生對(duì)象的名稱(chēng)可以省略掂摔!
使用示例如下:
當(dāng)然可能有一些強(qiáng)迫癥患者硬是要用靜態(tài)成員和靜態(tài)方法的話,你可以用下述關(guān)鍵字:
靜態(tài)成員:
- @JvmField 注解:生成與該屬性相同的靜態(tài)字段
- lateinit 關(guān)鍵字:延遲初始化赢赊,上一節(jié)定義空變量講了~
- const 關(guān)鍵字:將 Kotlin 屬性轉(zhuǎn)換成 Java 中的靜態(tài)字段(定義常量用)
靜態(tài)方法:
- @JvmStatic 注解:在單例對(duì)象和伴生對(duì)象中生成對(duì)應(yīng)的靜態(tài)方法
使用示例如下:
10.數(shù)據(jù)類(lèi)
就是只表示數(shù)據(jù)的類(lèi)乙漓,用 data 進(jìn)行聲明,默認(rèn)基于構(gòu)造方法中實(shí)現(xiàn)了:
toString(), componentN(), copy(), equals() 和 hashCode() 方法释移,
另外叭披,不在構(gòu)造方法中定義的屬性不會(huì)產(chǎn)生在toString()的結(jié)果中!
Data類(lèi)可以直接使用 == 進(jìn)行比較玩讳。
使用示例如下:
11.枚舉類(lèi)
Kotlin中的枚舉與Java中基本類(lèi)似涩蜘,用 enum 聲明為枚舉類(lèi)
最基本的用法是實(shí)現(xiàn)類(lèi)型安全的枚舉,比如熏纯,要你表示周一到周日同诫,大部人會(huì)使用1-7,
如果出現(xiàn)了異常情況樟澜,用戶(hù)輸入了0或者8误窖,枚舉可以看做對(duì)輸入的數(shù)據(jù)類(lèi)型做了限制
只能是枚舉中的某一個(gè)叮盘,從而實(shí)現(xiàn)了所謂的類(lèi)型安全。
使用示例如下:
除此之外霹俺,你還可以通過(guò)valueOf("名字")類(lèi)匹配或者values()拿到一個(gè)Array柔吼,
然后進(jìn)行遍歷~
12.封閉類(lèi)
用于限制類(lèi)的層次結(jié)構(gòu),值只能是集合中的類(lèi)型丙唧,不可以是其他任何類(lèi)型愈魏,
可以理解成 "擴(kuò)展的枚舉類(lèi)",但與枚舉有些不同:
枚舉中的實(shí)例是唯一的想际,而封閉類(lèi)可以有很多實(shí)例培漏,他們可以有不同的狀態(tài),
使用關(guān)鍵字 sealed 聲明(內(nèi)部的類(lèi)都是本身的子類(lèi))另外該關(guān)鍵字不能修飾接口或抽象類(lèi)沼琉,會(huì)報(bào)
waring北苟,但不會(huì)出現(xiàn)編譯錯(cuò)誤。另外有一點(diǎn)要區(qū)分:
直接子類(lèi)必須都寫(xiě)在封閉類(lèi)中4虮瘛S驯恰! 封閉類(lèi)子類(lèi)的擴(kuò)展可以在任何地方闺骚,而無(wú)需在同一個(gè)文件中彩扔!
使用密封類(lèi)的最主要的的好處體現(xiàn)在你使用 when 表達(dá)式,可以確保聲明可以覆蓋到所有的情形僻爽,不需要再使用
else 情形虫碉。
PS:在Kotlin 1.1中允許使用data數(shù)據(jù)類(lèi)繼承!
使用示例如下: