继承
在Kotlin中每一个类都有一个共同的父类Any,没有显示声明父类的话Any就是他的默认父类。Any中只有 equals()、hashCode()和toString()。
public open class Any { public open operator fun equals(other: Any?): Boolean public open fun hashCode(): Int public open fun toString(): String }
显示继承一个父类使用冒号
子类有主构造函数,父类则必须使用主构造函数初始化
//父类 open class Base(name: String) { constructor(name: String, age : Int): this(name) constructor(name: String, age : Int, sex: String): this(name) ...... } //子类的参数类型及个数与父类相同 class Example constructor(name: String) :Base(name){ ...... } //子类的参数类型和个数可以与父类不同 class Example constructor(name: String, age: Int) :Base(name){ ...... } //子类继承父类的次构造函数(次构造函数都会绑定主构造函数的,所以可以初始化父类的主构造函数) class Example constructor(name: String, age: Int) :Base(name,age){ ...... }
子类没有主构造函数,子类的次构造函数都必须绑定父类的构造函数(主次都行)。可以绑定同一个,也可以不同。
//父类 open class Base(name: String) { constructor(name: String, age : Int): this(name) constructor(name: String, age : Int, sex: String): this(name) ...... } //子类 class Example :Base{ constructor (name: String):super(name) constructor(name: String,age : Int): super(name) constructor(name: String, age : Int, sex: String): super(name,age) ...... }
父类没有显示的构造方法时,我们要初始化它的默认主构造方法
//父类 open class Base { ...... } //子类 class Example :Base( ){ ...... }
覆盖方法、属性、规则
Kotlin 必须 open 显示标注可以被覆盖的成员,且覆盖后的成员用 override 标注。否则编译失败。override标注的成员也可以被覆盖,如果不想再被覆盖的话使用 final 修饰。final override var a = ..
覆盖方法
//父类 open class Base{ open fun method(){} } //子类 class Example : Base() { override fun method() { super.method() } }
覆盖属性
覆盖属性与覆盖方法类似。我们可以用 val 修饰的属性覆盖 var 修饰的属性,但是不可以用 var 修饰的属性去覆盖 val 。因为一个 val 属性本质上声明了一个 getter 方法,而将其覆盖为 var 只是在子类中额外声明一个 setter 方法。
//父类 open class Base { open var attr: Boolean = false } //子类 class Example : Base() { override var attr: Boolean = true }
我们也可以在主构造函数中去覆盖属性
class Example(override var attr: Boolean) : Base() { ...... }
覆盖规则
子类继承父类并实现了接口时,如果有相同的函数时我们可以使用super< ? >指定要调用的父类或接口的函数(要调用的函数要有方法体不然会报错)。
interface BaseInterface { fun method(){ println("BaseInterface") } } open class Base { open fun method(){ println("Base") } } class Example: Base(),BaseInterface { override fun method() { super<BaseInterface>.method() super<Base>.method() } }