继承作为OOP的三大特性之一,Kotlin对其必然有自己的理解。Kotlin以“:”操作符,完成子类继承父类。
Any
The root of the Kotlin class hierarchy. Every Kotlin class has [Any] as a superclass.
在官方文档上是这么介绍Any类的,Any类是所有Kotlin文件的根,所有的类均继承于Any类。
创建一个类时,若未声明父类,其会隐式的继承于Any.
class Example // 隐式继承与 Any
Any类并不是java.lang.Object类。从下面的Any源码可以看出,其仅有equals(other: Any?)、 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(p: Ont)
class Derived(p: Int) : Base(p)
子类有主构造函数
如果子类有主构造函数, 则基类必须在主构造函数中立即初始化。
open class Person(var name : String, var age : Int){
override fun toString(): String{
return "Person(name='$name', age=$age)"
}
}
class Student(name : String, age : Int, var no : String, var score : Int) : Person(name, age) {
}
子类没有主构造函数
如果子类没有主构造函数,则必须在每一个二级构造函数中用 super 关键字初始化基类,或者在代理另一个构造函数。初始化基类时,可以调用基类的不同构造方法。
calss MyView : View {
constructor(ctx: Context) : super(ctx) {
}
constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {
}
}
重写
在父类中,使用fun声明函数时,此函数默认为final修饰,不能被子类重写。如果允许子类重写该函数,那么就要手动添加open修饰它。
open class Person(var name : String, var age : Int) : Any() {
open fun doSwim() {
}
override fun toString(): String{
return "Person(name='$name', age=$age)"
}
}
子类继承父类的函数
在kotlin中, 实现继承通常遵循如下规则:如果一个类从它的直接父类继承了同一个函数的多个实现,那么它必须重写这个函数并且提供自己的实现(或许只是直接用了继承来的实现) 为表示使用父类中提供的方法我们用 super 表示。
open class A {
open fun f () { print("A") }
fun a() { print("a") }
}
interface B {
fun f() { print("B") } //接口的成员变量默认是 open 的
fun b() { print("b") }
}
class C() : A() , B{
override fun f() {
super<A>.f()//调用 A.f()
super<B>.f()//调用 B.f()
}
}
C继承自a()或 b(),C不仅可以从A或则B中继承函数,而且C可以继承A()、B()中共有的函数。此时该函数在中只有一个实现,为了消除歧义,该函数必须调用A()和B()中该函数的实现,并提供自己的实现。
子类继承父类的成员变量
当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。具体的原则如下:
- 能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
- 对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
- 对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。