Kotlin 繼承

我們知道Java中所有的類都繼承于Object類,而在Kotlin中,Any類就相當于Java中的Object.
它是所有類的超類,對于沒有超類型聲明的類是默認超類。

class Demo // 從 Any 隱式繼承

Any 默認提供了三個函數(shù):

equals()

hashCode()

toString()

是不是跟Java中的Object一樣?嘿!

如果一個類要被繼承,可以使用 ++open++ 關(guān)鍵字進行修飾。

open class Base(p: Int)           // 定義基類

class Derived(p: Int) : Base(p)

構(gòu)造函數(shù)

繼承中涉及構(gòu)造函數(shù)分兩種情況:

  • 子類有主構(gòu)造函數(shù)
  • 子類沒有主構(gòu)造函數(shù)

子類有主構(gòu)造函數(shù)

如果子類有主構(gòu)造函數(shù), 則基類必須在主構(gòu)造函數(shù)中立即初始化。

open class Person (var name : String, var age : Int) {

    class Student(name : String, age : Int, var no : String, var score : Int) : Person(name, age) {

    }

    // 測試
    fun main(args: Array<String>) {
        val s =  Student("Jack", 18, "S12346", 89)
        println("學生名: ${s.name}")
        println("年齡: ${s.age}")
        println("學生號: ${s.no}")
        println("成績: ${s.score}")
    }
}

輸出結(jié)果:

學生名: Jack
年齡: 18
學生號: S12346
成績: 89

如果不這樣,就會出現(xiàn)

image

子類沒有主構(gòu)造函數(shù)

如果子類沒有主構(gòu)造函數(shù),則必須在每一個次級構(gòu)造函數(shù)中用 super 關(guān)鍵字初始化基類,或者在代理另一個構(gòu)造函數(shù)。初始化基類時,可以調(diào)用基類的不同構(gòu)造方法。
這跟Java其實是一樣的。子類的構(gòu)造方法都是會對父類初始化的

open class Person (var name : String, var age : Int) {

    class Student :Person {

        constructor(name : String, age : Int):super(name,age){
            
        }
    }
}

重寫(override)

  • 在基類中,使用fun聲明函數(shù)時,此函數(shù)默認為final修飾,不能被子類重寫
  • 如果允許子類重寫該函數(shù),那么就要手動添加 open 修飾它
  • 子類重寫方法使用 override 關(guān)鍵詞:
/**用戶基類**/
open class Person{
    open fun study(){       // 允許子類重寫
        println("我畢業(yè)了")
    }
}

/**子類繼承 Person 類**/
class Student : Person() {

    override fun study(){    // 重寫方法
        println("我上班了")
    }
}

fun main(args: Array<String>) {
    val s =  Student()
    s.study();

}

輸出結(jié)果:

我上班了

如果有多個相同的方法(繼承或者實現(xiàn)自其他類,如A、B類),則必須要重寫該方法,使用super范型去選擇性地調(diào)用父類的實現(xiàn)。

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

interface B {
    fun f() { print("B") } //接口的成員變量默認是 open 的
    fun b() { print("b") }
}

class C() : A() , B{
    override fun f() {
        super<A>.f()//調(diào)用 A.f()
        super<B>.f()//調(diào)用 B.f()
    }
}

fun main(args: Array<String>) {
    val c =  C()
    c.f();

}

C 繼承自 a() 或 b(), C 不僅可以從 A 或則 B 中繼承函數(shù),而且 C 可以繼承 A()、B() 中共有的函數(shù)。此時該函數(shù)在中只有一個實現(xiàn),為了消除歧義,該函數(shù)必須調(diào)用A()和B()中該函數(shù)的實現(xiàn),并提供自己的實現(xiàn)。
輸出結(jié)果為:

AB

屬性重寫

  • 屬性重寫使用 override 關(guān)鍵字
  • 屬性必須具有兼容類型
  • 每一個聲明的屬性都可以通過初始化程序或者getter方法被重寫
  • var 屬性可重寫為val 屬性,反之,則不行。
  • 可以在主構(gòu)造函數(shù)中使用 override 關(guān)鍵字作為屬性聲明的一部分

下面是示例:

open class Foo {
    open val x: Int get { …… }
}

class Bar1 : Foo() {
    override val x: Int = ……
}

還有:

interface Foo {
    val count: Int
}

class Bar1(override val count: Int) : Foo

class Bar2 : Foo {
    override var count: Int = 0
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容