关于继承性,Kotlin默认所有类都是final的(无法被继承),加open关键字类可以继承
//Kotlin默认所有类都是final的(无法被继承)
//open 与 final相反
open class Parent(name: String, age: Int){
}
//子类参数传递给父类
class Children(name: String, age: Int):Parent(name,age){
}
//若一个类无primary构造方法,secondary构造方法需要构造初始化super
open class Parent2(name: String){
}
//xx:xx xx继承于xx
class Child2:Parent2{
//定义secondary构造方法
constructor(name: String):super(name){
}
}
方法被重写输出
open class Food{
open fun name(){
println("food")
}
fun produceDate(){
println("1958.8.8")
}
}
class Fish : Food() {
override fun name() {
println("fish")
}
}
open class Egg : Food() {
//无法被其他子类继承此egg类覆写的方法name()
final override fun name() {
println("egg")
}
}
fun main(args: Array<String>) {
var fish = Fish()
fish.name()
fish.produceDate()
var egg = Egg()
egg.name()
}
output:
fish
1958.8.8
egg
方法和属性被重写输出,树和树苗类的继承关系,关于val和var的覆写区别
open class Tree{
open val name:String ="tree"
}
class Seeding : Tree() {
override val name:String ="seeding"
}
fun main(args: Array<String>) {
var seeding =Seeding()
println(seeding.name)
println("@@@@@@@@@@")
val seeding3 = Seeding3()
seeding3.grow()
println(seeding3.name)
}
class Seeding2(override val name: String) : Tree() {
}
open class Tree2{
open fun grow() {
println("树在生长")
}
open val name: String get() ="树"
}
class Seeding3 : Tree2() {
override fun grow() {
super.grow()
println("树苗也在生长")
}
override val name: String
get() = super.name + "和小树苗"
}
//(两者读写权限不同)var(get set方法)属性不能被val(get只读)属性覆写
output:
seeding
@@@@@@@@@@
树在生长
树苗也在生长
树和小树苗