Kotlin对象继承:属性覆盖

本文详细介绍了Kotlin中属性覆盖的语法和要求,包括如何使用open和override关键字进行属性覆盖,以及属性覆盖的具体规则,例如从val到var的转换限制等。

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

package com.init.demo.model

/**
 * 对象继承:属性覆盖
 * 属性覆盖的语法和方法覆盖的语法非常类似
 * 在超类的属性前面添加open修饰
 * 在子类的属性前添加override
 */
open class DemoVariableOverride {
    open var str: String = "a"
    open val str2: String = "a"
    open var str3: String = "a"
    override fun toString(): String {
        return "DemoVariableOverride to Hello Kotlin"
    }


}

/**
 *属性覆盖的要求:
 *每个声明的属性可以由具有初始化器的属性或者具有ge出r方法的属性覆盖。
 * 你可以用一个var属性覆盖一个val属性,反之则不行。也就是说,如果超
 * 类中属性只具有getter,那么子类覆盖它的属性可以只有getter,也可以既
 * 有getter又有setter,后者是对超类中相对应属性夕
 * 阳日功能的扩充,这也体现了覆盖的意义。如果超类中属性既有getter又
 * 有setter,那么子类覆盖它的属性必须既有getter又有setter,不能只有getter。
 * 也就是覆盖属性只能扩充外部功能,不能减少外部功能。
 * 在构造构造器的时候,写构造器参数的时候如果在参数名称前加一个var或val修饰
 * 符等于就是把它自动变为一个当前类的属性了。
 * 当然,这里在参数名前加上override val,也就是自动将它变为超类中相应属性的继承了

 */
class B : DemoVariableOverride() {

    override var str: String = "b"
    override val str2: String = "c"
//    override  val  str3 :String = "d"
}

fun main(args: Array<String>) {
    val b = B()
    println(b.str)
    println(b.str2)

    //在Kotlin的print和println中 如果传入一个对象,会自动访问对象的toString方法
    //如果当前类中没有重写的toString方法,就会自动访问超类中的toString方法
    val a = DemoVariableOverride()
    println(a)
    println(b)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值