Kotlin 继承(extend)
????????Kotlin 允许一个类继承自另一个类
????????Kotlin 中所有类都继承自 Any 类
????????Any 类是所有类的超类,对于没有超类型声明的类是默认超类
????????Kotlin 类默认都是封闭的,要让某个类开放继承,必须使用 open 关键字修饰它。
注意:
在 Kotlin 中 Any 类是所有类的超类
在 Java 中 Object 类是所有类的超类
Any 超类
????????Any 默认提供了三个函数:
public?open?class?Any?{
????
????public?open?operator?fun?equals(other:?Any?):?Boolean
????public?open?fun?hashCode():?Int
????public?open?fun?toString():?String
}
????????从这里发现 无论是类还是函数,都使用了 open 关键字修饰。
????????同时发现,这里只是定义了函数,没有实现。为什么呢?因为Kotlin是跨平台语言,可以在Android、macOS、Windows、JavaScript上运行,为了支持跨平台更友好,在不同平台有不同实现,所以在这里并未展示。
继承类
/*?食物基类?*/
open?class?Food{
????fun?explain()?=?"Food?explain"
}
class?Apple?:Food(){
????
}
????????不加 open 关键字修饰是不让继承滴,如下图:
函数重写
????????在基类中,使用 fun 声明函数时,此函数默认为 final 修饰,不能被子类重写。
????????如果允许子类重写该函数,那么必须使用 open 关键字修饰它, 子类重写函数使用 override 关键字。
/*?食物基类?*/
open?class?Food{
????//函数必须用?open?关键字修饰,子类才能覆盖
????open?fun?explain()?=?"Food?explain"
}
/*?继承Food?*/
class?Apple?:Food(){
????//使用?override?关键字覆盖父类函数
????override?fun?explain()?=?"Apple?explain?"
}
????????在 Kotlin 中 override 是个关键字而不是注解。
使用
fun?main()?{
????//多态:父类类型的引用子类类型的对象
????val?f:?Food?=?Apple()
????println(f.explain())
}
属性重写
/*?食物基类?*/
open?class?Food?{
????open?val?price?=?100
????...
}
/*?继承Food?*/
class?Apple?:?Food()?{
????override?var?price?=?36
????...
}
fun?main()?{
????//多态:父类类型的引用子类类型的对象
????val?f:?Food?=?Apple()
????println(f.explain())//Apple?explain?36
}
类型检测(is )
Kotlin的 is运算符 可以用来检查某个对象的类型。
????println(f?is?Food)//true
????println(f?is?Apple)//true
????println(f?is?File)//false
智能类型转换(as )
Kotlin的 as运算符 可以用对某个对象进行类型转换。
|