繼承說明
Kotlin 中所有類都繼承自Any
類,它是所有類的超類,對於沒有超類型聲明的類是默認超類:
class Empty // 從Any隱式繼承
Any
默認提供了三個函數:
equals()
hashCode()
toString()
注意:Any 不是 java.lang.Object。
Kotlin所有的類都默認是final
,如果一個類要被繼承,可以使用 open
關鍵字進行修飾。
open class Base(p: Int)
class Qfxl(p: Int) : Base(p)
構造函數
子類有主構造函數
如果子類有主構造函數, 則基類必須在主構造函數中立即初始化。
fun main(args: Array<String>) {
val stu = Student("qfxl","99",18)
println("student's name is ${stu.name} score is ${stu.score} age is ${stu.age}")
}
open class Person(name: String, age: Int)
class Student(var name: String,var score: String,var age: Int) : Person(name, age)
子類沒有主構造函數
如果子類沒有主構造函數,則必須在每一個二級構造函數中用 super 關鍵字初始化基類,或者在代理另一個構造函數。初始化基類時,可以調用基類的不同構造方法。
class MyView : View {
constructor(ctx: Context) : super(ctx)
constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs)
constructor(ctx: Context, attr: AttributeSet, defStyleAttr: Int) : super(ctx, attr, defStyleAttr)
}
如下所示:
fun main(args: Array<String>) {
Student("qfxl",18)
}
open class Person(name: String) {
constructor(name: String, age: Int) : this(name) {
println("你調用了基類的次構造函數")
}
}
class Student: Person {
constructor(name: String, age: Int) : super(name, age) {
println("Student name is $name age is $age")
}
}
重寫
在基類中,使用fun
聲明函數時,此函數默認爲final
修飾,不能被子類重寫。如果允許子類重寫該函數,那麼就要手動添加 open
修飾它, 子類重寫方法使用 override
關鍵字:
fun main(args: Array<String>) {
Student().speakLanguage()
}
open class Person {
open fun speakLanguage() {
println("I Speak CH")
}
}
class Student: Person() {
override fun speakLanguage() {
println("I Speak Eng")
}
}
輸出:I Speak Eng
如果有多個相同的方法(繼承或者實現自其他類),則必須要重寫該方法,使用super範型去選擇性地調用父類的實現。
open class Person {
open fun speakLanguage() {
println("I Speak Language")
}
}
interface Chinese {
fun speakLanguage() { //接口所有方法默認是open
println("I Speak Ch")
}
}
class Student : Person(), Chinese {
override fun speakLanguage() {
super<Person>.speakLanguage()
super<Chinese>.speakLanguage()
println("I Speak 中文")
}
}
Student
繼承了Chinese
跟Person
,由於speakLanguage
只有一個實現,爲了消除歧義,此時Student
必須調用Chinese
跟Person
中的實現,並提供自己的實現。
屬性重寫
屬性重寫使用 override
關鍵字,屬性必須具有兼容類型,每一個聲明的屬性都可以通過初始化程序或者getter
方法被重寫:
fun main(args: Array<String>) {
val stu = Student()
println(stu.name)
}
open class Person{
open val name : String = "Person"
}
class Student : Person() {
override val name: String
get() = "Student"
}
你可以用一個var
屬性重寫一個val
屬性,但是反過來不行。因爲val屬性本身定義了getter
方法,重寫爲var
屬性會在衍生類中額外聲明一個setter
方法
你可以在主構造函數中使用 override
關鍵字作爲屬性聲明的一部分:
interface Person {
val name : String
}
class Chinesse(override val name: String): Person
class Student : Person{
override val name: String
get() = "Student"
}