Kotlin基本使用-继承

Kotlin中每个类默认继承自Any,可显示指定父类。子类使用冒号进行继承,主构造函数初始化父类,无主构造函数则次构造函数需绑定父类构造。open关键字标记可覆盖成员,override标注覆盖方法和属性。覆盖规则允许在主构造函数中进行,并可通过super调用父类或接口的特定实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继承

  • 在Kotlin中每一个类都有一个共同的父类Any,没有显示声明父类的话Any就是他的默认父类。Any中只有 equals()、hashCode()和toString()。

    public open class Any {
    
        public open operator fun equals(other: Any?): Boolean
    
        public open fun hashCode(): Int
    
        public open fun toString(): String
    }
  • 显示继承一个父类使用冒号

    • 子类有主构造函数,父类则必须使用主构造函数初始化

      //父类
      open class Base(name: String) {
           constructor(name: String, age : Int): this(name)
           constructor(name: String, age : Int, sex: String): this(name)
           ......
      }
      
      //子类的参数类型及个数与父类相同
      class Example constructor(name: String) :Base(name){ ...... }
      //子类的参数类型和个数可以与父类不同
      class Example constructor(name: String, age: Int) :Base(name){ ...... } 
      //子类继承父类的次构造函数(次构造函数都会绑定主构造函数的,所以可以初始化父类的主构造函数)
      class Example constructor(name: String, age: Int) :Base(name,age){ ...... } 
      
    • 子类没有主构造函数,子类的次构造函数都必须绑定父类的构造函数(主次都行)。可以绑定同一个,也可以不同。

      //父类
      open class Base(name: String) {
           constructor(name: String, age : Int): this(name)
           constructor(name: String, age : Int, sex: String): this(name)
           ......
      }
      
      //子类
      class Example :Base{
          constructor (name: String):super(name)
          constructor(name: String,age : Int): super(name)
          constructor(name: String, age : Int, sex: String): super(name,age)
              ......
      }
      
    • 父类没有显示的构造方法时,我们要初始化它的默认主构造方法

      //父类
       open class Base { ...... }
      
      //子类
      class Example :Base( ){ ...... }
      
  • 覆盖方法、属性、规则
    Kotlin 必须 open 显示标注可以被覆盖的成员,且覆盖后的成员用 override 标注。否则编译失败。override标注的成员也可以被覆盖,如果不想再被覆盖的话使用 final 修饰。

    final  override var a = ..
    
    • 覆盖方法

      //父类
      open class Base{
          open fun method(){}
      }
      
      //子类
      class Example : Base() {
          override fun method() {
              super.method()
          }
      }
      
    • 覆盖属性

      覆盖属性与覆盖方法类似。我们可以用 val 修饰的属性覆盖 var 修饰的属性,但是不可以用 var 修饰的属性去覆盖 val 。因为一个 val 属性本质上声明了一个 getter 方法,而将其覆盖为 var 只是在子类中额外声明一个 setter 方法。

      //父类
      open class Base {
         open var attr: Boolean = false
      }   
      
      //子类
      class Example : Base() {
          override var attr: Boolean = true
      }   
      

      我们也可以在主构造函数中去覆盖属性

          class Example(override var attr: Boolean) : Base() { ...... }
      
    • 覆盖规则

      子类继承父类并实现了接口时,如果有相同的函数时我们可以使用super< ? >指定要调用的父类或接口的函数(要调用的函数要有方法体不然会报错)。

      interface BaseInterface {
          fun method(){
              println("BaseInterface")
          }
      }
      
      open class Base {
          open fun method(){
              println("Base")
          }
      }
      
      class Example: Base(),BaseInterface {
          override fun method() {
              super<BaseInterface>.method()
              super<Base>.method()
          }
      }       
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值