Kotlin 類和對象(六)

Kotlin 類和對象(六)

上一篇我們講了Kotlin的循環(huán)還有條件控制Kotlin 循環(huán)和條件控制(五) ,這次我們將要學(xué)習(xí)一個Kotlin的類與對象.

類:

Kotlin 中的類使用的也是 class 關(guān)鍵字聲明,類由類名爽冕、類頭(指定它的類型參數(shù)、主構(gòu)造器等等)和類體組成阳准,用花括號包圍棠枉。類頭和類體都是可選的套硼;如果類沒有類體則花括號可以省略。

//有類體的類
class Test {

 }

//沒有類體的類
class Test

構(gòu)造器:

構(gòu)造器?

構(gòu)造器是干哈的?

小白可能會很懵逼啊,是的構(gòu)造器是用來初始化一個類的,比如我這個類是沸騰的白開水,我需要使用它,我怎么才能擁有它呢?

1.直接用鍋煮.
2.用熱水壺.
3.用太陽曬

有的同學(xué)可能說這是不同的方式去成功拿到開水啊,是的構(gòu)造器也是這樣,我們的類可以有多個構(gòu)造,如果你不寫,也是有的!只是隱藏了起來,以免大家看見太多代碼頭暈!好了下面我來細(xì)致解釋一下各種構(gòu)造器,以及各做方式去初始化一個類:

這里有4個類,他們什么都沒有,但是他們都是有構(gòu)造的,并且是一樣的構(gòu)造,只是我們的寫法可以去省略這些代碼


這里的constructor 是他們省略的一個構(gòu)造,所以記住一句話,只要是類就有構(gòu)造!


如果構(gòu)造函數(shù)有注解或可見性修飾符,這個 constructor 關(guān)鍵字是必需的允华,并且這些修飾符在它前面,像下面這種寫在類名旁邊的構(gòu)造就是這個類的主構(gòu)造,可以傳遞不同的內(nèi)容去初始化這個類.當(dāng)然直接指定var,val這種參數(shù)可以讓這個參數(shù)變成這個類的成員,在類中使用


主構(gòu)造函數(shù)不能包含任何的代碼井联。初始化的代碼可以放到以 init 關(guān)鍵字作為前綴的初始化塊(initializer blocks)中卜壕。

當(dāng)然有主就有次,次構(gòu)造呢就是我之前舉得例子那樣,有很多種方式,比如用太陽把水曬沸騰...
開個玩笑哦,繼續(xù)看:

這里我就給Dad1 這個類寫了一個不同的構(gòu)造,主構(gòu)造是一個空的,而次構(gòu)造需要一個String類型的name來初始化這個類,每個次構(gòu)造函數(shù)需要委托給主構(gòu)造函數(shù), 可以直接委托或者通過別的次構(gòu)造函數(shù)間接委托烙常。委托到同一個類的另一個構(gòu)造函數(shù)用 this 關(guān)鍵字即可,那么怎去委托同一個類的其他構(gòu)造呢?請看第三個次構(gòu)造,第三個次構(gòu)造就是通過傳入2個參數(shù)去委托第二個構(gòu)造,最后在委托回主構(gòu)造.

如果你不希望你的類有一個公有構(gòu)造函數(shù)轴捎,你需要聲明一個帶有非默認(rèn)可見性的空的主構(gòu)造函數(shù):

還有一種直接給構(gòu)造中參數(shù)復(fù)制的操作,在繼承中可以發(fā)揮一些用途,其他的恕我還沒有探索到...


創(chuàng)建類的實例

在Kotlin里面創(chuàng)建實列和Java不一樣,變得更加簡單直接像調(diào)用函數(shù)一樣,創(chuàng)建,注意: 不用使用new了! 不用使用new了! 不用使用new了!

創(chuàng)建嵌套類、內(nèi)部類和匿名內(nèi)部類的類實例在[嵌套類]我們下一篇再講蚕脏。

繼承

在Kotlin中有一個共同超類,也就是Java中的Object ,在Kotlin 里面加Any,但是Any類中只有equals()侦副、hashCode()和toString() 三個函數(shù)外沒有其他任何成員了.

怎么去繼承一個類呢?

很簡單就是使用: 你要繼承的類,在父類前面加上open,這里的open 其實就是指可以被繼承,Kotlin 里面所有的類默認(rèn)是final ,需要繼承的類就指定open,并且需要指定構(gòu)造,就是下面的箭頭所指的構(gòu)造去初始化父類.

淡然也可以通過關(guān)鍵字super去初始化父類


覆蓋方法與屬性

覆蓋方法和屬性需要加上 override 這個關(guān)鍵字 , 如果不想子類覆蓋就在前面指定 final 這樣子類就沒辦法覆蓋了.不僅可以在成員位置覆蓋,在主構(gòu)造覆蓋也是可以的.

調(diào)用超類實現(xiàn)

派生類中的代碼可以使用 super 關(guān)鍵字調(diào)用其超類的函數(shù)與屬性訪問器的實現(xiàn):

open class Foo {
    open fun f() { println("Foo.f()") }
    open val x: Int get() = 1
}

class Bar : Foo() {
    override fun f() { 
        super.f()
        println("Bar.f()") 
    }

    override val x: Int get() = super.x + 1
}

在一個內(nèi)部類中訪問外部類的超類,可以通過由外部類名限定的 super 關(guān)鍵字來實現(xiàn):super@Outer

class Bar : Foo() {
    override fun f() { /* …… */ }
    override val x: Int get() = 0

    inner class Baz {
        fun g() {
            super@Bar.f() // 調(diào)用 Foo 實現(xiàn)的 f()
            println(super@Bar.x) // 使用 Foo 實現(xiàn)的 x 的 getter
        }
    }
}

覆蓋規(guī)則

在 Kotlin 中驼鞭,實現(xiàn)繼承由下述規(guī)則規(guī)定:如果一個類從它的直接超類繼承相同成員的多個實現(xiàn)秦驯, 它必須覆蓋這個成員并提供其自己的實現(xiàn)(也許用繼承來的其中之一)。 為了表示采用從哪個超類型繼承的實現(xiàn)挣棕,我們使用由尖括號中超類型名限定的 super译隘,如 super<Base>

open class A {
    open fun f() { print("A") }
    fun a() { print("a") }
}

interface B {
    fun f() { print("B") } // 接口成員默認(rèn)就是“open”的
    fun b() { print("b") }
}

class C() : A(), B {
    // 編譯器要求覆蓋 f():
    override fun f() {
        super<A>.f() // 調(diào)用 A.f()
        super<B>.f() // 調(diào)用 B.f()
  }
}

同時繼承 AB 沒問題亲桥,并且 a()b() 也沒問題因為 C 只繼承了每個函數(shù)的一個實現(xiàn)。 但是 f()C繼承了兩個實現(xiàn)细燎,所以我們必須C 中覆蓋 f() 并且提供我們自己的實現(xiàn)來消除歧義两曼。

抽象類

類和其中的某些成員可以聲明為 abstract。 抽象成員在本類中可以不用實現(xiàn)玻驻。 需要注意的是悼凑,我們并不需要用 open 標(biāo)注一個抽象類或者函數(shù)——因為這不言而喻。

我們可以用一個抽象成員覆蓋一個非抽象的開放成員

open class Base {
    open fun f() {}
}

abstract class Derived : Base() {
    override abstract fun f()
}

總結(jié):

Kotlin的類和對象是最基礎(chǔ)的東西,也是對于小白入門比較困難的東西,大家多多理解,理解是最重要的,加油!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末璧瞬,一起剝皮案震驚了整個濱河市户辫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗤锉,老刑警劉巖渔欢,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瘟忱,居然都是意外死亡奥额,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門访诱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垫挨,“玉大人,你說我怎么就攤上這事触菜【爬疲” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵涡相,是天一觀的道長哲泊。 經(jīng)常有香客問我,道長催蝗,這世上最難降的妖魔是什么切威? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮生逸,結(jié)果婚禮上牢屋,老公的妹妹穿的比我還像新娘。我一直安慰自己槽袄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布锋谐。 她就那樣靜靜地躺著遍尺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乾戏。 梳的紋絲不亂的頭發(fā)上迂苛,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音鼓择,去河邊找鬼三幻。 笑死,一個胖子當(dāng)著我的面吹牛呐能,可吹牛的內(nèi)容都是我干的念搬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼摆出,長吁一口氣:“原來是場噩夢啊……” “哼朗徊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起偎漫,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤爷恳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后象踊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體温亲,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年杯矩,在試婚紗的時候發(fā)現(xiàn)自己被綠了栈虚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡菊碟,死狀恐怖节芥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逆害,我是刑警寧澤头镊,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站魄幕,受9級特大地震影響相艇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纯陨,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一坛芽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翼抠,春花似錦咙轩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至量愧,卻和暖如春钾菊,著一層夾襖步出監(jiān)牢的瞬間帅矗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工煞烫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留浑此,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓滞详,卻偏偏與公主長得像凛俱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茵宪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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