7.5 Kotlin 继承


Java学习中我们知道,继承是面向对象编程语言的一个重要特征。 继承允许将父类的特性继承到子类。子类包含父类的特性以及它自己的特性。

什么是继承

假设我们有两个类Dog,Cat。所有这两个类都有一些属性(数据成员)和一些行为(成员函数)。
7.5.1
Dog跟Cat具有相同的属性 color、size,具有相同的行为eat()、drink()。为什么不创建具有公共属性和行为的泛化类,让这三个类继承该泛化类。此外,除了继承的类之外,这些类可以具有其独特的属性和行为。
7.5.2
Dog类继承了Animal类的所有函数,并添加了一个函数woof(),同样Cat类继承了Animal类的所有函数,并添加了它的独特函数meow()。

继承定义

  • 子类在类头中使用冒号操作符来继承基类(在子类名或构造函数之后)。
  • 在类之前使用open关键字来为其它类继承这个类。
  • 当继承一个类来子类时,所有的字段和函数都是继承的。 可以在子类中使用这些字段和函数。
    下面我们用kotlin来描述上面的示例:

open class Animal(var color: String, var size: Int) {

    init {
        println("Animal color is ${this.color} size is ${this.size}")
    }

    fun eat(){
        println("Animal eat")
    }

    fun drink(){
        println("Animal drink")
    }
}

class Dog(color: String, size: Int) :Animal(color, size){
    fun woof(){
        println("${this.javaClass.name} woof")
    }
}

class Cat(color: String, size: Int) :Animal(color, size) {
    fun meow(){
        println("${this.javaClass.name} meow")
    }
}

fun main(args: Array<String>) {
    val dog = Dog("white",3)
    dog.eat()
    dog.drink()
    dog.woof()

    val cat = Cat("black",4)
    cat.eat()
    cat.drink()
    cat.meow()
}

结果:

Animal color is white size is 3
Animal eat
Animal drink
Dog woof
Animal color is black size is 4
Animal eat
Animal drink
Cat meow

覆盖 Kotlin 中的成员函数和属性

如果子类中存在具有相同名称的函数或属性,则我们需要使用override关键字在子类中覆盖它们。

  • 要覆盖父类的方法,必须将要覆盖的父类及方法声明为open
  • 使用override关键字覆盖父类的成员函数。
  • 通过重写函数,子类为现​​有的基类代码提供自己的实现
  • 覆盖并不意味着它将更新基类中的代码,该更改仅适用于覆盖函数或其子类的类。

下面我们重写Dog和Cat类的eat、和drink函数:

open class Animal(var color: String, var size: Int) {

    init {
        println("Animal color is ${this.color} size is ${this.size}")
    }

    open fun eat(){
        println("Animal eat")
    }

    open fun drink(){
        println("Animal drink")
    }
}

class Dog(color: String, size: Int) :Animal(color, size){
    override fun eat(){
        println("${this.javaClass.name} eat")
    }

    override fun drink(){
        println("${this.javaClass.name} drink")
    }

    fun woof(){
        println("${this.javaClass.name} woof")
    }
}

fun main(args: Array<String>) {
    val dog = Dog("white",3)
    dog.eat()
    dog.drink()
    dog.woof()
}

结果:

Animal color is white size is 3
Dog eat
Dog drink
Dog woof

子类调用父类方法和属性

子类也可以使用super关键字调用父类方法和属性。

class Dog(color: String, size: Int) :Animal(color, size){
    override fun eat(){
        super.eat()
        println("${this.javaClass.name} eat")
    }

    override fun drink(){
        super.drink()
        println("${this.javaClass.name} drink")
    }

    fun woof(){
        println("${this.javaClass.name} woof")
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alfred Gao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值