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) }
Kotlin对象继承:属性覆盖
最新推荐文章于 2023-11-28 23:04:56 发布