Kotlin搞起來——4.類與對(duì)象


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)如下


修改日志

  • 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的!已更正效拭!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末暂吉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缎患,更是在濱河造成了極大的恐慌慕的,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挤渔,死亡現(xiàn)場(chǎng)離奇詭異肮街,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)判导,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門嫉父,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人眼刃,你說我怎么就攤上這事绕辖。” “怎么了擂红?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵仪际,是天一觀的道長。 經(jīng)常有香客問我昵骤,道長树碱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任涉茧,我火速辦了婚禮赴恨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伴栓。我一直安慰自己伦连,他們只是感情好雨饺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惑淳,像睡著了一般额港。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歧焦,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天移斩,我揣著相機(jī)與錄音,去河邊找鬼绢馍。 笑死向瓷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舰涌。 我是一名探鬼主播猖任,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瓷耙!你這毒婦竟也來了朱躺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤搁痛,失蹤者是張志新(化名)和其女友劉穎长搀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸡典,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡源请,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彻况。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巢钓。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疗垛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硫朦,我是刑警寧澤贷腕,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站咬展,受9級(jí)特大地震影響泽裳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜破婆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一涮总、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧祷舀,春花似錦瀑梗、人聲如沸烹笔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谤职。三九已至,卻和暖如春亿鲜,著一層夾襖步出監(jiān)牢的瞬間允蜈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工蒿柳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饶套,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓垒探,卻偏偏與公主長得像妓蛮,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叛复,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容