PS:有小伙伴說配圖有點(diǎn)意思眯亦,嘿嘿肢扯,今天的配圖是:
本節(jié)我們繼續(xù)來學(xué)習(xí)Kotlin的語法误算,這節(jié)學(xué)習(xí)的是非常常用的類與對(duì)象仰美,
把這四節(jié)的內(nèi)容都掌握了,基本就算kotlin入門了不逼逼儿礼,開始本節(jié)內(nèi)容
1.類的定義與對(duì)象實(shí)例化
Kotlin不同于Java咖杂,**允許在一個(gè)文件中定義多個(gè)類**,
首先關(guān)注的一點(diǎn)是:類蚊夫,成員變量诉字,成員方法的作用域,寫個(gè)簡單的例子:
然后打開生成 .class文件 可以看到對(duì)應(yīng)的修飾符:
從中我們可以得出以下結(jié)論:
沒有任何修飾符,默認(rèn)是private的壤圃,另外成員變量會(huì)默認(rèn)生成 **public final **的 getter和setter方法陵霉,
如果使用了private修飾,則不會(huì)生成伍绳!
一清二楚踊挠,另外kotlin中還允許直接class 類名,沒有類實(shí)體冲杀,一般用于
表示概念(沒什么卵用)效床!而創(chuàng)建一個(gè)類的對(duì)象以及方法調(diào)用同樣很簡單:
這里調(diào)用設(shè)置對(duì)象的屬性,其實(shí)是調(diào)用對(duì)應(yīng)生成的setXXX方法漠趁!對(duì)了扁凛,你還可以
自定義getter和setter方法
然后這里有個(gè)坑,就是如果你寫成get() = trueHeight闯传,會(huì)不停調(diào)用自身,然后OOM卤妒!
網(wǎng)上有人說在前面加個(gè)$甥绿,但實(shí)測(cè)不行,如果有解決方案的務(wù)必告知我则披!
另外共缕,你還可以再get和set方法前加private,這樣可以禁止外部調(diào)用士复!
2.構(gòu)造器(構(gòu)造方法)
Kotiln中的構(gòu)造器有三種:
主構(gòu)造器
- 1.如果一個(gè)非抽象類沒有聲明任何主次構(gòu)造器图谷,那么會(huì)默認(rèn)生成一個(gè)public無參的主構(gòu)造器!
- 2.一個(gè)類只有一個(gè)主構(gòu)造器阱洪,類頭部的一部分便贵,在類名后,constructor(參數(shù)列表)冗荸,
- 3.主構(gòu)造器中不能包含任何代碼承璃,如果想寫一些初始化代碼,可以寫到init初始化代碼塊中蚌本!
使用示例:
輔助構(gòu)造器
- 1.寫在類中盔粹,可以有一個(gè)或者多個(gè),用constructor關(guān)鍵字標(biāo)識(shí)程癌!
- 2.可以通過this()調(diào)用其他輔助構(gòu)造器舷嗡,但是任何一個(gè)輔助構(gòu)造器都必須調(diào)用主構(gòu)造器!
使用示例:
私有主構(gòu)造器
其實(shí)就是在主構(gòu)造器前加上一個(gè)private嵌莉,然后就只能通過輔助構(gòu)造器來實(shí)例化對(duì)象
3.繼承
Kotlin中繼承父類或者實(shí)現(xiàn)接口进萄,直接用 : 引號(hào)领跛,如果有多個(gè)可以用疙挺,逗號(hào)隔開,比如:
還記得一開始看class文件,類的默認(rèn)修飾符是:public final映跟,final意味著,這個(gè)類
是不能改變的唐片,如果你想繼承這個(gè)類厚柳,進(jìn)行一些重寫的話,你需要把class前加上 open 關(guān)鍵字熊杨,
子類構(gòu)造方法需實(shí)現(xiàn)父類構(gòu)造方法曙旭,而方法的修飾符也是 final 的,如果你想重寫
某個(gè)方法晶府,同樣要為方法加上 open 關(guān)鍵字桂躏,而在重寫方法處加上 override 關(guān)鍵字;
另外川陆,你還可以用 super 關(guān)鍵字來調(diào)用父類中的方法剂习,這點(diǎn)和Java是一樣的。
使用示例:
4.接口與抽象類
Kotlin中的接口類似于Java8较沪,支持抽象方法鳞绕,抽象屬性,還支持包含實(shí)現(xiàn)的方法
接口與其中的方法默認(rèn)是 open 的和Java一樣尸曼,使用 interface 聲明们何!
接口與抽象類的區(qū)別在于:接口不能存儲(chǔ)狀態(tài)數(shù)據(jù),可以擁有屬性控轿,但是這些屬性必須
是抽象的冤竹,或者提供訪問器的自定義實(shí)現(xiàn)!
使用示例:
另外茬射,如果一個(gè)需要實(shí)現(xiàn)的類或接口中包含同名方法鹦蠕,可以使用<>來指明調(diào)用的是哪個(gè)
父類方法!比如:
5.抽象類
和接口類似躲株,不顧默認(rèn)是open的片部,但是對(duì)于抽象成員,需要使用 abstract關(guān)鍵字聲明霜定!
使用示例:
7.內(nèi)部類
類可以嵌套在其他類中档悠,如果只是簡單的嵌套,內(nèi)部類是無法訪問外部類成員的望浩!
如果你想在內(nèi)部類中訪問外部成員辖所,你需要使用 inner 關(guān)鍵字進(jìn)行聲明。
而匿名內(nèi)部類就不說了磨德,不知道的可以看回第一節(jié)缘回。
8.單例對(duì)象與伴生對(duì)象
Kotlin中沒有 靜態(tài)屬性和方法吆视,如果你想實(shí)現(xiàn)類似于單例的功能,
你可以使用關(guān)鍵字 object 聲明一個(gè)對(duì)象酥宴,對(duì)象的構(gòu)造器不能提供構(gòu)造器參數(shù)啦吧,
在第一次使用的時(shí)候會(huì)被初始化,可用于提供常量或共享不可變對(duì)象拙寡!
使用示例:
除此之外授滓,Kotlin中還提供了 伴生對(duì)象 這種東西,用companion關(guān)鍵字聲明肆糕,
可以直接類.成員訪問成員般堆,有點(diǎn)類似于靜態(tài)成員,但是在運(yùn)行時(shí)诚啃,它們依舊是實(shí)體
的實(shí)例成員淮摔,另外使用companion關(guān)鍵字時(shí),伴生對(duì)象的名稱可以省略始赎!
使用示例:
如果你硬是要搞成Java中的靜態(tài)成員和靜態(tài)方法的話和橙,你可以用:
靜態(tài)成員:
- @JvmField注解:生成與該屬性相同的靜態(tài)字段
- lateinit關(guān)鍵字:延遲初始化(沒用過)
- const()關(guān)鍵字:將 Kotlin 屬性轉(zhuǎn)換成 Java 中的靜態(tài)字段(定義常量用)
靜態(tài)方法:
- @JvmStatic注解:在單例對(duì)象和伴生對(duì)象中生成對(duì)應(yīng)的靜態(tài)方法
關(guān)于這里更多內(nèi)容可見:http://kotlinlang.cn/docs/reference/object-declarations.html
9.數(shù)據(jù)類
就是只表示數(shù)據(jù)的類,用 data 進(jìn)行聲明极阅,默認(rèn)基于構(gòu)造方法中實(shí)現(xiàn)了:
toString(), componentN(), copy(), equals() 和 hashCode() 方法胃碾,
另外,不在構(gòu)造方法中定義的屬性不會(huì)產(chǎn)生在toString()的結(jié)果中筋搏!
Data類可以直接使用 == 進(jìn)行比較。
使用示例:
10.枚舉類
Kotlin中的枚舉與Java中基本類似厕隧,用 enum 聲明為枚舉類
使用示例:
除此之外你還可以通過valueOf("名字")來匹配或者values()拿到一個(gè)Array奔脐,
然后進(jìn)行遍歷。
11.封閉類
限制類的層次結(jié)構(gòu)吁讨,值只能是集合中的類型髓迎,不餓可以是其他任何類型
可以理解成"擴(kuò)展的枚舉類",枚舉中的實(shí)例是唯一的建丧,而封閉類可以
有很多實(shí)例排龄,他們可以有不同的狀態(tài),使用關(guān)鍵字 sealed 聲明
(內(nèi)部的類都是本身的子類)翎朱,直接子類必須都寫在封閉類中i衔!拴曲!
有一點(diǎn)要注意:封閉類的子類的擴(kuò)展可以在任何地方争舞,不需要寫在封閉類內(nèi)部!
使用密封類的最主要的的好處體現(xiàn)在你使用 when 表達(dá)式澈灼。
可以確保聲明可以覆蓋到所有的情形竞川,不需要再使用 else 情形店溢。
沒用過,直接祭出官方示例:
本章小結(jié)
本節(jié)對(duì)Kotlin中與類和對(duì)象有關(guān)的知識(shí)點(diǎn)進(jìn)行了全面的講解:
- 1.類的定義與對(duì)象實(shí)例化
- 2.構(gòu)造器(構(gòu)造方法)
- 3.繼承
- 4.接口與抽象類
- 5.抽象類
- 7.內(nèi)部類
- 8.單例對(duì)象與伴生對(duì)象
- 9.數(shù)據(jù)類
- 10.枚舉類
- 11.封閉類
相信對(duì)你對(duì)Kotlin的認(rèn)識(shí)又更進(jìn)一步了委乌,大塊的東西已經(jīng)在這四節(jié)里面說完床牧,
然后接下來的一節(jié)是一些小知識(shí)點(diǎn)補(bǔ)充,在下一節(jié)是結(jié)合Anko重構(gòu)之前寫個(gè)
的一個(gè)很小的項(xiàng)目遭贸,再接著是番外篇——實(shí)際開發(fā)中用Kotlin中的一些技巧
和實(shí)例~敬請(qǐng)期待戈咳!
如果覺得這個(gè)系列對(duì)你學(xué)習(xí)Kotlin有所幫助,點(diǎn)個(gè)喜歡唄~
本節(jié)參考文獻(xiàn)如下:
- 從零開始的Kotlin之類和對(duì)象(一)
- Step into Kotlin
- kotlin-for-android-developers-zh
- 官方文檔(英語)
- 官方文檔(中文
- Kotlin-in-Chinese
修改日志:
- 2016.11.17 感謝基友Berial指出的錯(cuò)誤
1.private修飾變量會(huì)生成getter方法的革砸,然而那個(gè)方法是自己寫的除秀,把自己也給坑了,已修正算利!
- 2016.11.28 感謝基友靜靜指出的錯(cuò)誤>
1.var定義的變量是private final的册踩,對(duì)應(yīng)的getter和setter才是public final的!已更正效拭!