(新) Kotlin搞起來(lái) —— 4.類(lèi)與對(duì)象

標(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)繼承!

使用示例如下


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胸梆,一起剝皮案震驚了整個(gè)濱河市敦捧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碰镜,老刑警劉巖兢卵,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绪颖,居然都是意外死亡秽荤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)柠横,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)窃款,“玉大人,你說(shuō)我怎么就攤上這事牍氛〕考蹋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵搬俊,是天一觀的道長(zhǎng)紊扬。 經(jīng)常有香客問(wèn)我曲饱,道長(zhǎng),這世上最難降的妖魔是什么珠月? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮楔敌,結(jié)果婚禮上啤挎,老公的妹妹穿的比我還像新娘。我一直安慰自己卵凑,他們只是感情好庆聘,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著勺卢,像睡著了一般伙判。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黑忱,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天宴抚,我揣著相機(jī)與錄音,去河邊找鬼甫煞。 笑死菇曲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抚吠。 我是一名探鬼主播常潮,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼楷力!你這毒婦竟也來(lái)了喊式?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤萧朝,失蹤者是張志新(化名)和其女友劉穎岔留,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體剪勿,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贸诚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厕吉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酱固。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖头朱,靈堂內(nèi)的尸體忽然破棺而出运悲,到底是詐尸還是另有隱情,我是刑警寧澤项钮,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布班眯,位于F島的核電站希停,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏署隘。R本人自食惡果不足惜宠能,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望磁餐。 院中可真熱鬧违崇,春花似錦、人聲如沸诊霹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脾还。三九已至伴箩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鄙漏,已是汗流浹背嗤谚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怔蚌,地道東北人呵恢。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像媚创,于是被迫代替她去往敵國(guó)和親渗钉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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