美文网首页
kotlin inheritance 继承

kotlin inheritance 继承

作者: 甲乙丙丁你我他 | 来源:发表于2017-05-24 12:43 被阅读0次

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

    相关文章

      网友评论

          本文标题:kotlin inheritance 继承

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