Kotlin学习笔记之类的继承

757 阅读3分钟
  • 所有的类都有一个共同的超类Any,一个类如果没有显示的声明超类,那么他的超类就是Any

  • 而且所有的类默认都是final的,默认不允许被继承,如果要允许被继承,需要用open关键字标记他

  • 继承一个超类的语法为将其添加到:之后,如下

    class SubInitOrderDemo(name:String):InitOrderDeme(name){
    ​
    }
    
  • 继承一个父类时,关于对父类的初始化有两点需要注意

    • 如果子类有一个主构造函数,那么其父类必须用子类的主构造函数的参数进行初始化

    • 如果子类没有主构造函数,那么子类中的每个次构造函数必须使用super关键字初始化父类,或者委托给另一个次构造函数做到这一点。当然,此时不同的次构造函数可以调用父类中不同的构造函数。

      class MyView : View {
          constructor(ctx: Context) : super(ctx)
          constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs)
      }
      
之所以必须调用父类的构造函数,是为了在初始化子类时,可以将父类初始化。
覆盖方法
open class InitOrderDeme(name:String) :Any() {
    //被open修饰的可以被继承的方法 Described by lxj on 2021/2/5 15:40
    open fun secondMethod(){
        println("基类中的第二个方法")
    }
}
​
class SubInitOrderDemo(name:String):InitOrderDeme(name) {
    //1、只能重写基类中用open关键字修饰的方法,同时基类必须声明为open。
    //2、重写时,方法必须用关键词override修饰。
    //3、在子类中可以通过super关键字访问父类中的方法或者属性 Described by lxj on 2021/2/5 15:41
    override fun secondMethod() {
        super.secondMethod()
        println(super.firstProperty)
        println("子类中的second方法")
    }
}

继承时覆盖方法的注意点有:

  • 只有open类的open方法可以被覆盖
  • 子类中的重写方法必须用关键字override修饰
  • 子类中的重写方法可以继续被其子类重写,如果要禁止被重写,可以用关键字final修饰
覆盖属性

覆盖属性与覆盖方法类似,子类可以使用关键字override覆盖父类中用open关键字覆盖的属性。

子类初始化顺序

在构造子类的时候,会先初始化其父类。

所以如果在父类的初始化过程中,调用了通过open修饰的方法或者属性,就可能导致错误,所以在设计父类时,应避免在构造函数、属性初始化器以及init块中使用open方法或者属性

调用父类的实现
  • 子类中的代码可以使用super关键字调用父类的方法或者属性。
  • 在一个内部类中访问外部类的超类,可以通过由外部类名限定的super关键字来实现。语法为super@Outer
class SubInitOrderDemo(name:String):InitOrderDeme(name) {
    override fun secondMethod() {
        super.secondMethod() // 子类调用父类的方法  2021/6/21
        println(super.firstProperty)
        println("子类中的second方法")
    }
​
    inner class InnerOrderDemo(){
        fun method(){
            //使用此调用方式时,必须在inner class中  2021/6/21
            super@SubInitOrderDemo.toString()
        }
    }
}
同时继承类以及接口时,调用方法时的覆盖规则
open class SubInitOrderDemo(name:String):InitOrderDeme(name) {
    override fun secondMethod() {
        super.secondMethod() // 子类调用父类的方法  2021/6/21
        println("子类中的second方法")
    }
}
​
interface Order{
    fun secondMethod(){
        print("Order Interface secondMethod")
    }
}
​
class OtherOrderDemo(name: String):SubInitOrderDemo(name),Order{
    override fun secondMethod() {
        // 调用SubInitOrderDemo中的方法  2021/6/21
        super<SubInitOrderDemo>.secondMethod()
        // 调用interface  Order 中的方法  2021/6/21
        super<Order>.secondMethod()
    }
}

为了表示调用哪个超类型的方法,采用尖括号限定的super关键字来实现,语法为super.method()