/**子類繼承 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}
applixy
org***126.com
幾點(diǎn)補(bǔ)充:
1、子類繼承父類時(shí),不能有跟父類同名的變量,除非父類中該變量為 private,或者父類中該變量為 open 并且子類用 override 關(guān)鍵字重寫(xiě):