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() }