Kotlin 继承

来源于菜鸟教程。

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关键字作为属性声明的一部分:

 

posted @ 2018-12-22 16:44  斗酒相逢a  阅读(191)  评论(0编辑  收藏  举报