继承

kotlin中所有的类都继承自Any类,他是所有类的超类。
Any 默认提供了三个函数:

1
2
3
4
5
equals()

hashCode()

toString()

在kotlin中,父类被定义为基类。
如果子类有主构造函数,那么子类在主构造函数时,就要初始化父类的属性。
如果子类是使用次构造函数,那么通过super标签继承父类的构造函数,可以是父类的主构造函数,也可以是次构造函数。

1
2
3
4
5
6
7
8
class Student : Person {

constructor(ctx: Context) : super(ctx) {
}

constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {
}
}

重写

在基类中,使用fun声明函数时,此函数默认为final修饰,不能被子类重写。如果允许子类重写该函数,那么就要手动添加 open 修饰它, 子类重写方法使用 override 关键词:
可以用var重写一个val的属性,但是不能用val重写一个var的属性,因为val不具备setter方法,无法正确继承并重写。

子类重写父类的方法时,是可以继承其函数体的,通过super来实现。
例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
interface A {
fun foo() { print("A") } // 已实现
fun bar() // 未实现,没有方法体,是抽象的
}

interface B {
fun foo() { print("B") } // 已实现
fun bar() { print("bar") } // 已实现
}

class C : A {
override fun bar() { print("bar") } // 重写
}

class D : A, B {
override fun foo() {
super<A>.foo()
super<B>.foo()
}

override fun bar() {
super<B>.bar()
}
}

fun main(args: Array<String>) {
val d = D()
d.foo();
d.bar();
}