?Kotlin是一門基于JVM的開發(fā)語言,已成為Android官方開發(fā)語言已有一段時(shí)間了,最近也開始學(xué)習(xí)Kotlin這門新的語言了,就算不做Android開發(fā),做后端服務(wù)開發(fā)用Kotlin也是不錯(cuò)的選擇,與Java可以100%的進(jìn)行互操作。今天先寫關(guān)于Kotlin類的繼承與重寫,做此筆記,以便以后復(fù)習(xí)。
- 類的繼承
- 在Kotlin中,所有類在默認(rèn)情況下都是無法被繼承的,簡而言之,就是說Kotlin中,所有類在默認(rèn)情況下都是final的,但如何才能被繼承,Kotlin給我們提供了一個(gè)關(guān)鍵字open,只有被open修飾的類才可以被繼承(關(guān)鍵字open的作用與final相反),否則編譯器會(huì)報(bào)錯(cuò)。示例如下:
open class Parent(name: String, age: Int) {
......
}
class Child(name: String, age: Int): Parent(name, age) {
......
}
- 在Kotlin中,如果一個(gè)類沒有primary構(gòu)造方法,那么這個(gè)類的每個(gè)secondary構(gòu)造方法就需要通過super關(guān)鍵字來初始化父類型或通過其他secondary構(gòu)造方法完成這個(gè)任務(wù),不同的secondary構(gòu)造方法可以調(diào)用父類型不同的構(gòu)造方法。
open class Parent2(name: String) {
......
}
class Child2: Parent2 {
constructor(name: String): super(name) {
......
}
}
也可以這樣寫:
class Child3(name: String): Parent2(name){
......
}
- 類的方法重寫
- 在kotlin中,類中的方法也是final類型,是不能被重寫的,也需在方法前面加上open關(guān)鍵字后才可以;子類要重寫父類中open修飾的方法,需在子類的方法前面加override關(guān)鍵字。如下所示:
open class Color {
open fun name() {
println("red")
}
fun type() {
println("7 ColorS")
}
}
class Blue: Color() {
override fun name() {
println("blue")
}
}
- 若在父類中方法override前再加上final后,子類中的該方法是不能被重寫的,否則編譯器會(huì)報(bào)錯(cuò)。如下所示:
open class Orange: Color() {
final override fun name() {
println("orange")
}
}
如下所示,編譯器會(huì)報(bào)錯(cuò):'name' in 'Orange' is final and cannot be overridden),
若去掉override,則會(huì)報(bào):'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())
}
輸出結(jié)果如下:
blue
7 Colors
orange
- 類的屬性重寫
- 類前面加open與方法和屬性(成員變量)open作用是不一樣的,類前加open關(guān)鍵字表示類可以被繼承,方法和屬性前加open關(guān)鍵字表示方法和屬性可以被重寫。如下所示:
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)
}
輸出結(jié)果如下:
child
- val與var修飾的屬性或成員變量的重寫的不同之處:
- val屬性是可以被val的屬性所override的;
- var屬性是可以被val屬性override的;
- val屬性是不能被var屬性所override的。
- 本質(zhì)上val相當(dāng)于get方法,var相當(dāng)于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)
}
輸出結(jié)果如下:
parent method
child method
parent and child
好了,今天就寫到這里。