Kotlin學習筆記(五)【繼承】

繼承說明

Kotlin 中所有類都繼承自Any 類,它是所有類的超類,對於沒有超類型聲明的類是默認超類:

class Empty // 從Any隱式繼承

Any 默認提供了三個函數:

equals()

hashCode()

toString()

注意:Any 不是 java.lang.Object。
Kotlin所有的類都默認是final,如果一個類要被繼承,可以使用 open 關鍵字進行修飾。

open class Base(p: Int)

class Qfxl(p: Int) : Base(p)

構造函數

子類有主構造函數

如果子類有主構造函數, 則基類必須在主構造函數中立即初始化。

fun main(args: Array<String>) {
    val stu = Student("qfxl","99",18)
    println("student's name is ${stu.name} score is ${stu.score} age is ${stu.age}")
}


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

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

子類沒有主構造函數

如果子類沒有主構造函數,則必須在每一個二級構造函數中用 super 關鍵字初始化基類,或者在代理另一個構造函數。初始化基類時,可以調用基類的不同構造方法。

class MyView : View {

    constructor(ctx: Context) : super(ctx)

    constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs)

    constructor(ctx: Context, attr: AttributeSet, defStyleAttr: Int) : super(ctx, attr, defStyleAttr)
}

如下所示:

fun main(args: Array<String>) {
    Student("qfxl",18)
}


open class Person(name: String) {
    constructor(name: String, age: Int) : this(name) {
        println("你調用了基類的次構造函數")
    }
}

class Student: Person {
    constructor(name: String, age: Int) : super(name, age) {
        println("Student name is $name age is $age")
    }
}

重寫

在基類中,使用fun聲明函數時,此函數默認爲final修飾,不能被子類重寫。如果允許子類重寫該函數,那麼就要手動添加 open 修飾它, 子類重寫方法使用 override 關鍵字:

fun main(args: Array<String>) {
    Student().speakLanguage()
}


open class Person {
  open fun speakLanguage() {
      println("I Speak CH")
  }
}

class Student: Person() {
    override fun speakLanguage() {
        println("I Speak Eng")
    }
}

輸出:I Speak Eng

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

open class Person {
    open fun speakLanguage() {
        println("I Speak Language")
    }
}

interface Chinese {
    fun speakLanguage() { //接口所有方法默認是open
        println("I Speak Ch")
    }
}

class Student : Person(), Chinese {
    override fun speakLanguage() {
        super<Person>.speakLanguage()
        super<Chinese>.speakLanguage()
        println("I Speak 中文")
    }
}

Student繼承了ChinesePerson,由於speakLanguage只有一個實現,爲了消除歧義,此時Student必須調用ChinesePerson中的實現,並提供自己的實現。

屬性重寫

屬性重寫使用 override 關鍵字,屬性必須具有兼容類型,每一個聲明的屬性都可以通過初始化程序或者getter方法被重寫:

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

open class Person{
    open val name : String = "Person"
}

class Student : Person() {
    override val name: String
        get() = "Student"
}

你可以用一個var屬性重寫一個val屬性,但是反過來不行。因爲val屬性本身定義了getter方法,重寫爲var屬性會在衍生類中額外聲明一個setter方法
你可以在主構造函數中使用 override 關鍵字作爲屬性聲明的一部分:

interface Person {
    val name : String
}

class Chinesse(override val name: String): Person

class Student : Person{
    override val name: String
        get() = "Student"
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章