来源于菜鸟教程。
Kotlin 中所有类都继承该Any类,它是所有类的超类,对于没有超类型声明的类是默认超类:
class Example // 从Any 隐式继承
Any默认提供了三个函数:
equals() hashCode() toString()
注意:Any不是java.lang.Object
如果一个类要被继承,可以使用open关键字进行修饰。
open class Base(p : Int) //定义基类 class Derived(p : Int): Base(p)
构造函数
子类有主构造函数
如果子类有主构造函数,则基类必须在主构造中立即初始化。
子类没有主构造函数
如果子类没有主构造函数,则必须在每一个二级构造函数中使用super关键字初始化基类,或者在代理另一个构造函数。初始化基类时,可以调用基类的不同构造方法。
实例:
结果:
可以看到先执行基类的次级构造函数,再执行继承类次级构造函数。
重写
在基类中,使用fun声明函数时,此函数默认为final修饰,不能被子类重写。如果允许子类重写该函数,那么就要手动添加open修饰,子类重写方法使用override关键词:
如果有多个相同的方法(继承或者实现自其他类,如A,B类),则必须要重写该方法,使用super范型去选择性的调用父类的实现。
C继承自a()或者b(),C不仅可以从A或B中继承函数,而且C可以继承A(),B()共有的函数。此时该函数在中只有一个实现。为了消除歧义。该函数必须调用A()和B()函数的实现,并提供自己的实现。
属性重写
属性重写使用override关键字,属性必须具有兼容类型,每一个声明的属性都可以通过初始化程序或者getter方法被重写:
open class Foo { open val x : Int get { .....} } class Bar1 : Foo(){ override val x : Int = .... }
你可以用一个var属性重写一个val属性,但是反过来不行。因为val属性本身定义了getter方法。重写为var属性会在衍生类中额外声明一个setter方法。
简单来说:var可以变为val。var不可以变为var。
你可以在主构造函数中使用override关键字作为属性声明的一部分: