- 在 Kotlin 中所有类都有一个共同的超类
Any
,声明类时如果不指定超类,都是默认继承自Any
注意:
Any
和Java的java.lang.Object
不同;Any
它除了equals()
、hashCode()
与toString()
外没有任何成员。 更多细节请查阅Java互操作性部分。
-
在Kotlin中,只有
open
的类才能作为超类,没有显示声明为open
的类都是默认为final
. -
如果基类(Java中的父类)有主构造函数,那么在派生类中,可以有两种做法:
- 派生类中有主构造函数,并且用基类的主构造函数就地初始化;
- 派生类中没有主构造函数,必须在每个次构造函数中使用
super
关键字调用基类的主构造函数就地初始化。
open class Person (var name: String) {
}
class Student(name: String, var age: Int) : Person(name) {
var tel: String = ""
var addr: String = ""
public constructor(name: String, age: Int, addr: String, tel: String) : this(name, age) {
this.tel = tel
}
}
class Teacher : Person {
constructor(name: String) : super(name) {
}
constructor(name: String, age: Int): super(name) {
}
}
方法覆盖
-
超类中的方法必须声明为
open
才能被复写,复写方法用override
修饰符 -
标记为
override
的方法本身就是open
的,如果不想被子类复写,可以添加final
修饰符。
属性覆盖
-
属性覆盖与方法覆盖类似,必须声明为
open
的属性才能被覆写,复写属性以override
修饰符开头 -
超类在主构造函数中定义的属性,默认为final,如果需要复写,可添加
open
修饰符 -
属性覆盖必须要有兼容的类型,被覆盖的属性可以是带有初始化器,或者带有
getter
方法 -
val
的属性可以覆盖成var
,反之则不行(val
属性相当于只有getter
,而var
属性相当于有getter
和setter
,val
的属性可以覆盖成var
,只是增加了一个setter
方法)
open class Person (open val name: String) {
open var id: Int = 0
}
class Teacher : Person {
override var id: Int = 0
override var name: String = ""
constructor(name: String) : super(name) {
}
constructor(name: String, age: Int): super(name) {
}
}