Any
所有类都继承该类,提供默认的三个函数:
equals()
hashCode()
toString()
继承声明:
在类的构造函数之后使用:标识继承
父类

子类

当类未声明构造函数时,继承其他类时,也不需要在primary constructor显示的声明构造函数,必须在secondary constructor中显示调用父类构造函数,若父类有多个构造函数,可以选择其一进行调用。
所有类定义时默认是final属性,不可被继承。若需要继承,使用open关键字进行修饰。
方法重载:
方法默认是final的,不可被子类重载,若需要被重载,使用关键词open进行修饰,子类重载方法使用override关键词;需要显式 标注可覆盖的成员(开放 open)和覆盖后的成员:
override修饰的方法,默认是可以被继承的。标记为override的成员本身是开放的,也就是说,它可以在子类中覆盖。若希望不被继承,可以使用final关键词修饰。
final override fun study(){}
方法重载规则:
当类同时继承类和实现接口,且有相同方法,且相同方法都有实现时,需要在重载方法中调用所继承的方法,使用关键词super<T>,T表示所继承或实现的接口;
open class A {
open fun f(){
print("A")
}
fun a() {
print("a")
}
}
interface B {
// 接口成员默认就是“open”的
fun f() {
print("B")
}
fun b() {
print("b")
}
}
class C(): A(), B {
// 编译器要求覆盖 f():
override fun f() {
// 必须在C中覆盖f()并且提供我们自己的实现来消除歧义,此处这样调用是为了举例说明
// 调用 A.f()
super<A>.f()
// 调用 B.f()
super<B>.f()
}
}当接口未实现方法时,默认为父类的study方法,不需要调用所继承的方法;
抽象类:
允许有abstract修饰的成员方法,非抽象类不允许有抽象方法;
abstract class User {
abstract fun study()
}
class Person: User {
// 必须有一个secondary constructor,否则会报This type has a constructor,and thus
// must be initialized here的编译错误
constructor(){
}
override fun study() {
}
}抽象类默认是可被继承的,接口是特殊的抽象类,允许有抽象方法:
interface Reading{
abstract fun reading()
}