Calling non-final function sound in constructor

kotlin继承的时候,在init里面调用一个被复写的方法sound,在生成子类对象调用父类的init方法时,不会调用父类的sound,而是调用子类的sound,这是因为:调用init方法的是子类对象,所以sound也是子类方法先,即使init里面是this.sound,当前对象是子类,就是调用子类的sound

open class Animal(color: String, age: Int) {
    open fun sound(color: String, age: Int) {
        println("Color is $color")
        println("Age is $age")
    }
    init {
        sound(color, age)
    }
}

class Dog(color: String, age: Int) : Animal(color, age) {
    override fun sound(color:String,age:Int){
        println("Dog,color :$color,age:$age make sounds woof")
    }
}

fun main(args: Array<String>) {
    var d = Dog("white", 12)
    d.sound("Black",11)
}

输出为:

Dog,color :white,age:12 make sounds woof
Dog,color :Black,age:11 make sounds woof

去掉子类复写的方法则符合预期

open class Animal(color: String, age: Int) {
    open fun sound(color: String, age: Int) {
        println("Color is $color")
        println("Age is $age")
    }
    init {
        sound(color, age)
    }
}

class Dog(color: String, age: Int) : Animal(color, age) {
//    override fun sound(color:String,age:Int){
//        println("Dog,color :$color,age:$age make sounds woof")
//    }
}

fun main(args: Array<String>) {
    var d = Dog("white", 12)
    d.sound("Black",11)
}

输出为:

Color is white
Age is 12
Color is Black
Age is 11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值