一吵瞻、繼承
Kotlin 中所有類都繼承該 Any 類积蔚,它是所有類的超類莺治,對于沒有超類型聲明的類是默認(rèn)超類:
class Example // 從 Any 隱式繼承
Any 默認(rèn)提供了三個(gè)函數(shù):
- equals()
- hashCode()
- toString()
注意:Any 不是 java.lang.Object捂寿。
如果一個(gè)類要被繼承牡拇,可以使用 open 關(guān)鍵字進(jìn)行修飾魁瞪。
open class Base(p: Int) // 定義基類
class Derived(p: Int) : Base(p)
1、構(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) {
}
2、子類沒有主構(gòu)造函數(shù)
如果子類沒有主構(gòu)造函數(shù)剔蹋,則必須在每一個(gè)二級(jí)構(gòu)造函數(shù)中用 super 關(guān)鍵字初始化基類旅薄,或者在代理另一個(gè)構(gòu)造函數(shù)。初始化基類時(shí)泣崩,可以調(diào)用基類的不同構(gòu)造方法赋秀。
class Student : Person {
constructor(ctx: Context) : super(ctx) {
}
constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {
}
}
3、方法重寫
- 在基類中律想,使用fun聲明函數(shù)時(shí)猎莲,此函數(shù)默認(rèn)為final修飾,不能被子類重寫技即。
- 如果允許子類重寫該函數(shù)著洼,那么就要手動(dòng)添加 open 修飾它;
- 子類重寫方法使用 override 關(guān)鍵詞而叼;
/**用戶基類**/
open class Person{
open fun study(){ // 允許子類重寫
println("我畢業(yè)了")
}
}
/**子類繼承 Person 類**/
class Student : Person() {
override fun study(){ // 重寫方法
println("我在讀大學(xué)")
}
}
如果有多個(gè)相同的方法(繼承或者實(shí)現(xiàn)自其他類身笤,如A、B類)葵陵,則必須要重寫該方法液荸,使用super范型去選擇性地調(diào)用父類的實(shí)現(xiàn)。
4脱篙、屬性重寫
屬性重寫使用 override 關(guān)鍵字娇钱,屬性必須具有兼容類型伤柄,每一個(gè)聲明的屬性都可以通過初始化程序或者getter方法被重寫:
open class Foo {
open val x: Int get { …… }
}
class Bar1 : Foo() {
override val x: Int = ……
}
注意:一個(gè)var屬性重寫一個(gè)val屬性,但是反過來不行文搂。因?yàn)関al屬性本身定義了getter方法适刀,重寫為var屬性會(huì)在衍生類中額外聲明一個(gè)setter方法
二、接口
Kotlin 接口與 Java 8 類似煤蹭,使用 interface 關(guān)鍵字定義接口笔喉,允許方法有默認(rèn)實(shí)現(xiàn):
interface MyInterface {
var name:String //屬性, 抽象的,子類必須實(shí)現(xiàn)
fun bar() // 未實(shí)現(xiàn)
fun foo() { //已實(shí)現(xiàn)
// 可選的方法體
println("foo")
}
}
接口中的屬性只能是抽象的硝皂,不允許初始化值常挚,接口不會(huì)保存屬性值,實(shí)現(xiàn)接口時(shí)稽物,必須重寫屬性