美文网首页
kotlin语言学习07 ——kotlin继承与重写

kotlin语言学习07 ——kotlin继承与重写

作者: LiangLliu | 来源:发表于2019-12-23 17:21 被阅读0次

    本节主要介绍kotlin的继承和重写。

    1、kotlin的继承

    1.1、kotlin的默认是final修饰的

    在kotlin中,所有的类在默认情况下都是无法被继承的,与Java是完全相反的。
    换句话说,在Kotlin中,所有的类默认情况下是final的。
    继承方式如下 :

    子类 : 父类   
    

    和C++比较相似,示例如下:

    /**
     * 继承 : extends
     * 在kotlin中,所有的类在默认情况下都无法被继承的,与Java是完全相反的
     * 话句话说,在kotlin中,所有的类默认情况下是final的
     */
    
    class Parent(name: String, age: Int) {
    
    }
    
    // 继承 Parent
    class Child(name: String, age: Int) : Parent(name, age) {
    
    }
    

    但是上面程序是报错的:

    父类未开放

    1.2、open关键字

    open: 与final关键字相反,使用open关键字修饰一个类,这个类就可以被继承。

    open关键字修饰后

    1.3、如果类没有primary而继承

    在kotlin中,如果一个类没有primary构造方法,那么这个类的每个secondary构造方法就需要通过super关键字来初始化类型,或者通过其他secondary来完成这个任务,不同的secondary构造方法可以调用父类型不同的构造方法。

    子类没有主构造方法时继承

    Child2并没有primary构造方法,,Kotlin中提供了 secondary方法,就可以使用secondary构造方法来进行初始化。

    使用secondary方法初始化柱构造方法
    /**
     * 父类2
     */
    open class Parent2(name: String) {
    
    }
    
    /**
     * 继承父类2
     *
     * 在kotlin中,如果一个类没有primary构造方法,那么这个类的每个secondary构造方法
     * 就需要通过super关键字类初始化类类型,或者通过其他secondary来完成这个任务
     * 不同的secondary构造方法可以调用父类型不同的构造方法
     */
    class Child2 : Parent2 {
        constructor(name: String) : super(name)
    
    }
    

    2、方法重写

    kotlin在重写上的方法跟 C#很相似。

    方法重写未修饰

    2.1 kotlin中open和override关键字的使用

    需要显示的指定override关键字,但还是报错

    使用override关键字修饰后

    需要将Fruit中的name 方法开放,使用 open 关键字修饰。

    使用open关键字修饰后

    kotlin通过关键字强制要求程序表明含义,kotlin 通过这种方式,语义上面更好理解。

    2.2、final关键字的使用

    如果继承后的方法不想被子类继承,可以加上final

    /**
     * 橘子类
     */
    open class Orange : Fruit() {
        // 如果该方法不想被子类继承,可以加上final
        final override fun name() {
            println("orange")
        }
    }
    

    3、属性的重写

    Kotlin中属性的重写和方法的重写基本类似。

    属性重未修饰

    3.1、kotlin属性的重写

    同样需要使用open 关键字和 Override关键字进行修饰。

    使用open和primary关键字修饰后

    3.2、在primary方法中声明重写的属性

    /**
     * 在primary方法中声明重写的属性
     */
    class MyChild2(override  val name:String):MyParent() {
    
    }
    

    3.3、val与var定义的属性重写问题

    /**
     * 父类 MyParent3
     */
    open class MyParent3 {
        open fun method() {
            println("parent method")
        }
    
        open val name: String get() = "parent"
    }
    
    /**
     * 子类MyChild3
     * 1、val属性可以 override val属性
     * 2、val属性不能 override var属性
     * 3、var属性可以 override val属性
     *
     * 本质上,val相当于get方法,var相当于get,set方法
     * var默认为public级别的定义,相当于,扩展了 变量的修饰空间
     */
    class MyChild3 : MyParent3() {
        override fun method() {
            super.method()
            println("child method")
        }
    
        override val name: String
            get() = super.name + " and child "
    }
    

    在主函数中调用:

    fun main() {
        val myChild3 = MyChild3()
        myChild3.method()
        println(myChild3.name)
    }
    

    结果 :

    parent method
    child method
    parent and child   
    

    相关文章

      网友评论

          本文标题:kotlin语言学习07 ——kotlin继承与重写

          本文链接:https://www.haomeiwen.com/subject/uoftoctx.html