我們知道Java中所有的類都繼承于Object類楚里,而在Kotlin中,Any類就相當(dāng)于Java中的Object.
它是所有類的超類括改,對于沒有超類型聲明的類是默認(rèn)超類腻豌。
class Demo // 從 Any 隱式繼承
Any 默認(rèn)提供了三個函數(shù):
equals()
hashCode()
toString()
是不是跟Java中的Object一樣?嘿!
如果一個類要被繼承家坎,可以使用 ++open++ 關(guān)鍵字進(jì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("學(xué)生名: ${s.name}")
println("年齡: ${s.age}")
println("學(xué)生號: ${s.no}")
println("成績: ${s.score}")
}
}
輸出結(jié)果:
學(xué)生名: Jack
年齡: 18
學(xué)生號: S12346
成績: 89
如果不這樣,就會出現(xiàn)
子類沒有主構(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ù)默認(rèn)為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") } //接口的成員變量默認(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ù)在中只有一個實現(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
}