继承
1.必须 open
Java中的类默认都是开放的,如果想类不开放,需要设置 final;Kotlin中的类默认都是final的,如果想开放需要设置open。
类、方法、属性都需要单独设置open,子类才可以覆写
open class 类名{
...
open var/val 属性名 = 属性值
...
open fun 函数名()
...
}
2.使用 :表示继承
Java中使用 extend 表示继承;Kt中使用 :号
3.只继承主构造函数
open class Fruit(p: Int)
class Apple(a: Int) : Fruit(a) {
}
4.主构造和次构造函数都继承
open class Fruit(p: Int) {
init {
println("p ==$p")
}
constructor(name: String) : this(233)
constructor(name: String ,p:Int ) : this(p)
}
class Apple : Fruit {
constructor(p: Int) : super(p)
constructor(name: String) : super(name)
constructor(name: String, p: Int) : super(name, p)
}
父类没有主构造函数,只继承次构造函数也这么写
方法重写
1.必须 open
open class Fruit(p: Int) {
fun log(){
}
open fun print(){
}
}
2.重写
class Apple : Fruit {
fun log(){
}
override fun print() {
super.print()
}
}
属性重写
1.不能重写val,可以重写var
父
open class Fruit(p: Int) {
open var tag = "父"
open val clz = "父"
}
子
class Apple : Fruit {
override var tag
get() = super.tag
set(value) {
super.tag = value
}
override var clz: String
get() = super.clz
set(value) {
println("value = $value")
}
}
测试
val apple = Apple("")
apple.tag = "tag 属性重写"
apple.print()
输出
2022-02-08 16:16:33.175 7994-7994/com.example.kotlintestdemo I/System.out: tag ==tag 属性重写
2022-02-08 16:16:33.175 7994-7994/com.example.kotlintestdemo I/System.out: clz ==父
2022-02-08 16:16:33.175 7994-7994/com.example.kotlintestdemo I/System.out: value = 这是子类重写的
2.覆盖
2.1.val 和 var 可以被覆盖成 var
如上重写的栗子,var 覆写成var ,依然支持修改;但是val 重写成var依然不支持修改,只是不报错
父
open class Fruit(p: Int) {
open var tag = "父"
open val clz = "父"
}
子
class Apple : Fruit {
override var tag = "子"
override var clz = "子"
}
2.2.var 不能覆盖成 val
```java
class Apple : Fruit {
override val tag = "子"
override var clz = "子"
}
调用超类
使用 super.
|