Kotlin学习笔记——类继承

  • 在 Kotlin 中所有类都有一个共同的超类Any,声明类时如果不指定超类,都是默认继承自Any

注意:Any 和Java的java.lang.Object不同;Any它除了 equals()hashCode()toString() 外没有任何成员。 更多细节请查阅Java互操作性部分。

  • 在Kotlin中,只有open的类才能作为超类,没有显示声明为open的类都是默认为final.

  • 如果基类(Java中的父类)有主构造函数,那么在派生类中,可以有两种做法:

  1. 派生类中有主构造函数,并且用基类的主构造函数就地初始化;
  2. 派生类中没有主构造函数,必须在每个次构造函数中使用super关键字调用基类的主构造函数就地初始化。
open class Person (var name: String) {
}

class Student(name: String, var age: Int) : Person(name) {

    var tel: String = ""
    var addr: String = ""
    
    public constructor(name: String, age: Int, addr: String, tel: String) : this(name, age) {
        this.tel = tel
    }
}

class Teacher : Person {

    constructor(name: String) : super(name) {

    }

    constructor(name: String, age: Int): super(name) {

    }
}

方法覆盖

  • 超类中的方法必须声明为open才能被复写,复写方法用override修饰符

  • 标记为override的方法本身就是open的,如果不想被子类复写,可以添加final修饰符。

属性覆盖

  • 属性覆盖与方法覆盖类似,必须声明为open的属性才能被覆写,复写属性以override修饰符开头

  • 超类在主构造函数中定义的属性,默认为final,如果需要复写,可添加open修饰符

  • 属性覆盖必须要有兼容的类型,被覆盖的属性可以是带有初始化器,或者带有getter方法

  • val的属性可以覆盖成var,反之则不行(val属性相当于只有getter,而var属性相当于有gettersetterval的属性可以覆盖成var,只是增加了一个setter方法)

open class Person (open val name: String) {
    open var id: Int = 0
}

class Teacher : Person {

    override var id: Int = 0
    override var name: String = ""

    constructor(name: String) : super(name) {

    }

    constructor(name: String, age: Int): super(name) {

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值