- 在 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) {
}
}
本文深入探讨Kotlin中的类与继承机制,包括类的默认超类Any、open类的作用、派生类构造函数的调用规则、方法与属性的覆盖细节等。通过具体示例,展示如何在Kotlin中实现类的继承与方法的复写。
697

被折叠的 条评论
为什么被折叠?



