本节主要介绍kotlin的继承和重写。
1、kotlin的继承
1.1、kotlin的默认是final修饰的
在kotlin中,所有的类在默认情况下都是无法被继承的,与Java是完全相反的。
换句话说,在Kotlin中,所有的类默认情况下是final的。
继承方式如下 :
子类 : 父类
和C++比较相似,示例如下:
/**
* 继承 : extends
* 在kotlin中,所有的类在默认情况下都无法被继承的,与Java是完全相反的
* 话句话说,在kotlin中,所有的类默认情况下是final的
*/
class Parent(name: String, age: Int) {
}
// 继承 Parent
class Child(name: String, age: Int) : Parent(name, age) {
}
但是上面程序是报错的:
1.2、open关键字
open: 与final关键字相反,使用open关键字修饰一个类,这个类就可以被继承。
1.3、如果类没有primary而继承
在kotlin中,如果一个类没有primary构造方法,那么这个类的每个secondary构造方法就需要通过super关键字来初始化类型,或者通过其他secondary来完成这个任务,不同的secondary构造方法可以调用父类型不同的构造方法。
Child2并没有primary构造方法,,Kotlin中提供了 secondary方法,就可以使用secondary构造方法来进行初始化。
/**
* 父类2
*/
open class Parent2(name: String) {
}
/**
* 继承父类2
*
* 在kotlin中,如果一个类没有primary构造方法,那么这个类的每个secondary构造方法
* 就需要通过super关键字类初始化类类型,或者通过其他secondary来完成这个任务
* 不同的secondary构造方法可以调用父类型不同的构造方法
*/
class Child2 : Parent2 {
constructor(name: String) : super(name)
}
2、方法重写
kotlin在重写上的方法跟 C#很相似。
2.1 kotlin中open和override关键字的使用
需要显示的指定override关键字,但还是报错
需要将Fruit中的name 方法开放,使用 open 关键字修饰。
kotlin通过关键字强制要求程序表明含义,kotlin 通过这种方式,语义上面更好理解。
2.2、final关键字的使用
如果继承后的方法不想被子类继承,可以加上final
/**
* 橘子类
*/
open class Orange : Fruit() {
// 如果该方法不想被子类继承,可以加上final
final override fun name() {
println("orange")
}
}
3、属性的重写
Kotlin中属性的重写和方法的重写基本类似。
3.1、kotlin属性的重写
同样需要使用open 关键字和 Override关键字进行修饰。
3.2、在primary方法中声明重写的属性
/**
* 在primary方法中声明重写的属性
*/
class MyChild2(override val name:String):MyParent() {
}
3.3、val与var定义的属性重写问题
/**
* 父类 MyParent3
*/
open class MyParent3 {
open fun method() {
println("parent method")
}
open val name: String get() = "parent"
}
/**
* 子类MyChild3
* 1、val属性可以 override val属性
* 2、val属性不能 override var属性
* 3、var属性可以 override val属性
*
* 本质上,val相当于get方法,var相当于get,set方法
* var默认为public级别的定义,相当于,扩展了 变量的修饰空间
*/
class MyChild3 : MyParent3() {
override fun method() {
super.method()
println("child method")
}
override val name: String
get() = super.name + " and child "
}
在主函数中调用:
fun main() {
val myChild3 = MyChild3()
myChild3.method()
println(myChild3.name)
}
结果 :
parent method
child method
parent and child
网友评论