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

    /**次級(jí)構(gòu)造函數(shù)**/
    constructor(name:String,age:Int,no:String,score:Int):super(name,age){
        println("-------繼承類次級(jí)構(gòu)造函數(shù)---------")
        println("學(xué)生名: ${name}")
        println("年齡: ${age}")
        println("學(xué)生號(hào): ${no}")
        println("成績(jī): ${score}")
    }}fun main(args: Array<String>) {
    var s =  Student("Runoob", 18, "S12345", 89)}

輸出結(jié)果:

-------基類次級(jí)構(gòu)造函數(shù)----------------繼承類次級(jí)構(gòu)造函數(shù)---------學(xué)生名: Runoob年齡: 18學(xué)生號(hào): S12345成績(jī): 89

重寫(xiě)

在基類中,使用fun聲明函數(shù)時(shí),此函數(shù)默認(rèn)為final修飾,不能被子類重寫(xiě)。如果允許子類重寫(xiě)該函數(shù),那么就要手動(dòng)添加 open 修飾它, 子類重寫(xiě)方法使用 override 關(guān)鍵詞:

/**用戶基類**/open class Person{
    open fun study(){       // 允許子類重寫(xiě)
        println("我畢業(yè)了")
    }}/**子類繼承 Person 類**/class Student : Person() {

    override fun study(){    // 重寫(xiě)方法
        println("我在讀大學(xué)")
    }}fun main(args: Array<String>) {
    val s =  Student()
    s.study();}

輸出結(jié)果為:

我在讀大學(xué)

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

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{
    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í)該函數(shù)在中只有一個(gè)實(shí)現(xiàn),為了消除歧義,該函數(shù)必須調(diào)用A()和B()中該函數(shù)的實(shí)現(xiàn),并提供自己的實(shí)現(xiàn)。

輸出結(jié)果為:

AB

屬性重寫(xiě)

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

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

你可以用一個(gè)var屬性重寫(xiě)一個(gè)val屬性,但是反過(guò)來(lái)不行。因?yàn)関al屬性本身定義了getter方法,重寫(xiě)為var屬性會(huì)在衍生類中額外聲明一個(gè)setter方法

你可以在主構(gòu)造函數(shù)中使用 override 關(guān)鍵字作為屬性聲明的一部分:

interface Foo {
    val count: Int}class Bar1(override val count: Int) : Fooclass Bar2 : Foo {
    override var count: Int = 0}