Kotlin是一门基于JVM的开发语言,已成为Android官方开发语言已有一段时间了,最近也开始学习Kotlin这门新的语言了,就算不做Android开发,做后端服务开发用Kotlin也是不错的选择,与Java可以100%的进行互操作。今天先写关于Kotlin类的继承与重写,做此笔记,以便以后复习。
- 类的继承
- 在Kotlin中,所有类在默认情况下都是无法被继承的,简而言之,就是说Kotlin中,所有类在默认情况下都是final的,但如何才能被继承,Kotlin给我们提供了一个关键字open,只有被open修饰的类才可以被继承(关键字open的作用与final相反),否则编译器会报错。示例如下:
open class Parent(name: String, age: Int) {
......
}
class Child(name: String, age: Int): Parent(name, age) {
......
}
- 在Kotlin中,如果一个类没有primary构造方法,那么这个类的每个secondary构造方法就需要通过super关键字来初始化父类型或通过其他secondary构造方法完成这个任务,不同的secondary构造方法可以调用父类型不同的构造方法。
open class Parent2(name: String) {
......
}
class Child2: Parent2 {
constructor(name: String): super(name) {
......
}
}
也可以这样写:
class Child3(name: String): Parent2(name){
......
}
- 类的方法重写
- 在kotlin中,类中的方法也是final类型,是不能被重写的,也需在方法前面加上open关键字后才可以;子类要重写父类中open修饰的方法,需在子类的方法前面加override关键字。如下所示:
open class Color {
open fun name() {
println("red")
}
fun type() {
println("7 ColorS")
}
}
class Blue: Color() {
override fun name() {
println("blue")
}
}
- 若在父类中方法override前再加上final后,子类中的该方法是不能被重写的,否则编译器会报错。如下所示:
open class Orange: Color() {
final override fun name() {
println("orange")
}
}
如下所示,编译器会报错:'name' in 'Orange' is final and cannot be overridden),
若去掉override,则会报:'name' hides member of supertype 'Orange' and needs 'override' modifier
class SmallOrange: Orange() {
override fun name() {
println("small orange")
}
}
fun main(args: Array<String>) {
val color = Color();
println(color.name())
println(color.type())
val color1 = Orange();
println(color1.name())
}
输出结果如下:
blue
7 Colors
orange
- 类的属性重写
- 类前面加open与方法和属性(成员变量)open作用是不一样的,类前加open关键字表示类可以被继承,方法和属性前加open关键字表示方法和属性可以被重写。如下所示:
open class MyParent {
open val name: String = "parent"
}
class MyChild: MyParent() {
override val name: String = "child";
}
也可以这样写:
class MyChild2(override val name: String): MyParent() {
......
}
fun main(args: Array<String>) {
val myChild = MyChild()
println(myChild.name)
}
输出结果如下:
child
- val与var修饰的属性或成员变量的重写的不同之处:
- val属性是可以被val的属性所override的;
- var属性是可以被val属性override的;
- val属性是不能被var属性所override的。
- 本质上val相当于get方法,var相当于set与get方法
open class MyParent3 {
open fun method() {
println("parent method")
}
open val name: String get() = "parent"
}
class MyChild3: MyParent3() {
override fun method() {
super.method()
println("child method")
}
override val name: String
get() = super.name + " and child"
}
fun main(args: Array<String>) {
val myChild3 = MyChild3()
println(myChild3.method())
println(myChild3.name)
}
输出结果如下:
parent method
child method
parent and child
好了,今天就写到这里。