一、Kt类如何继承
-
与Java不同,Kt类的继承需要使用冒号(😃,冒号后面需要调用父类的构造器
-
kt和Java一样,都是单继承 ,只能有一个父类
-
kt默认class是final的 也就是说默认不允许继承,需要显式使用open关键字允许继承class
open class Parent //需要使用open声明Parent类 才允许其他类继承
{
protected var mName : String = "Bill"
fun getName() : String
{
return mName
}
}
class Child : Parent() //Child类继承Parent类 现在mName 和getName在Child中都可以访问
{
fun printName()
{
println(mName)
}
}
二、重写方法
-
在kt中 方法默认是不可重写的
-
如果要在子类中重写方法,需要在父类相应的方法前面加open关键字
-
而且要在子类重写的方法前面加override关键字
open class Cat
{
protected var mName : String = "ACat"
open fun getName() : String
{
return mName
}
}
open class Tom:Cat()
{
fun printName()
{
println(getName())
}
//重写父类的getName方法 如果一个方法前面加了override,那么这个方法可以被重写
override fun getName(): String {
return "<" + super.getName()+">"
}
}
Cat().getName()
// 现在调用的getName方法,实际上,执行的是Tom自身的getName方法
Tom().getName()
如果一个方法前面加了override,那么这个方法可以被重写
open class Tom:Cat()
{
fun printName()
{
println(getName())
}
//重写父类的getName方法 如果一个方法前面加了override,那么这个方法可以被重写
override fun getName(): String {
return "<" + super.getName()+">"
}
}
class BTom : Tom()
{
//再次重写get Name方法 如果想阻止getName方法被子类重写, 需要在override前面在final
final override fun getName(): String {
return "【"+ super.getName()+ "】"
}
}
如果想阻止getName方法被子类重写, 需要在override前面在final
三、重写属性
-
被重写的属性必须使用open声明,子类中重写的属性必须用override声明,
-
不过val属性可以被重写为var属性 ,但是var属性不可以被重写为val属性
open class Dog
{
open val name:String = "WangWang"
get()
{
println("获取Dog.name属性")
return field
}
}
open class ADog : Dog()
{
override var name : String = "Mike"
get()
{
println("获取ADog.name属性")
return field
}
set(value)
{
field = name
println("ADog.name被写入")
}
}