Kotlin類的繼承與重寫

?Kotlin是一門基于JVM的開發(fā)語言,已成為Android官方開發(fā)語言已有一段時(shí)間了,最近也開始學(xué)習(xí)Kotlin這門新的語言了,就算不做Android開發(fā),做后端服務(wù)開發(fā)用Kotlin也是不錯(cuò)的選擇,與Java可以100%的進(jìn)行互操作。今天先寫關(guān)于Kotlin類的繼承與重寫,做此筆記,以便以后復(fù)習(xí)。

  1. 類的繼承
  • 在Kotlin中,所有類在默認(rèn)情況下都是無法被繼承的,簡而言之,就是說Kotlin中,所有類在默認(rèn)情況下都是final的,但如何才能被繼承,Kotlin給我們提供了一個(gè)關(guān)鍵字open,只有被open修飾的類才可以被繼承(關(guān)鍵字open的作用與final相反),否則編譯器會(huì)報(bào)錯(cuò)。示例如下:
open class Parent(name: String, age: Int) {
    ......
}

class Child(name: String, age: Int): Parent(name, age) {
    ......
}
  • 在Kotlin中,如果一個(gè)類沒有primary構(gòu)造方法,那么這個(gè)類的每個(gè)secondary構(gòu)造方法就需要通過super關(guān)鍵字來初始化父類型或通過其他secondary構(gòu)造方法完成這個(gè)任務(wù),不同的secondary構(gòu)造方法可以調(diào)用父類型不同的構(gòu)造方法。
open class Parent2(name: String) {
    ......
}

class Child2: Parent2 {
    constructor(name: String): super(name) {
        ......
    }
}

也可以這樣寫:
class Child3(name: String): Parent2(name){
    ......
}
  1. 類的方法重寫
  • 在kotlin中,類中的方法也是final類型,是不能被重寫的,也需在方法前面加上open關(guān)鍵字后才可以;子類要重寫父類中open修飾的方法,需在子類的方法前面加override關(guān)鍵字。如下所示:
open class Color {
    open fun name() {
        println("red")
    }

    fun type() {
        println("7 ColorS")
    }
}

class Blue: Color() {
    override fun name() {
        println("blue")
    }
}
  • 若在父類中方法override前再加上final后,子類中的該方法是不能被重寫的,否則編譯器會(huì)報(bào)錯(cuò)。如下所示:
open class Orange: Color() {
    final override fun name() {
        println("orange")
    }
}

如下所示,編譯器會(huì)報(bào)錯(cuò):'name' in 'Orange' is final and cannot be overridden),
若去掉override,則會(huì)報(bào):'name' hides member of supertype 'Orange' and needs 'override' modifier

class SmallOrange: Orange() {
    override fun name() {
        println("small orange")
    }
}

fun main(args: Array<String>) {
    val color = Color();
    println(color.name())
    println(color.type())

    val color1 = Orange();
    println(color1.name())
}

輸出結(jié)果如下:
blue
7 Colors
orange
  1. 類的屬性重寫
  • 類前面加open與方法和屬性(成員變量)open作用是不一樣的,類前加open關(guān)鍵字表示類可以被繼承,方法和屬性前加open關(guān)鍵字表示方法和屬性可以被重寫。如下所示:
open class MyParent {
    open val name: String = "parent"
}

class MyChild: MyParent() {
    override val name: String = "child";
}

也可以這樣寫:
class MyChild2(override val name: String): MyParent() {
    ......
}

fun main(args: Array<String>) {
    val myChild = MyChild()
    println(myChild.name)
}

輸出結(jié)果如下:
child
  • val與var修飾的屬性或成員變量的重寫的不同之處:
    • val屬性是可以被val的屬性所override的;
    • var屬性是可以被val屬性override的;
    • val屬性是不能被var屬性所override的。
    • 本質(zhì)上val相當(dāng)于get方法,var相當(dāng)于set與get方法
open class MyParent3 {
    open fun method() {
        println("parent method")
    }

    open val name: String get() = "parent"
}

class MyChild3: MyParent3() {
    override fun method() {
        super.method()

        println("child method")
    }

    override val name: String
        get() = super.name + " and child"
}

fun main(args: Array<String>) {
    val myChild3 = MyChild3()
    println(myChild3.method())
    println(myChild3.name)
}

輸出結(jié)果如下:
parent method
child method
parent and child

好了,今天就寫到這里。

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

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

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