日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Kotlin实战指南五:继承、接口

發(fā)布時(shí)間:2024/9/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kotlin实战指南五:继承、接口 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載請(qǐng)標(biāo)明出處:https://blog.csdn.net/zhaoyanjun6/article/details/87874895
本文出自【趙彥軍的博客】


繼承、接口

    • 繼承
      • 子類有主構(gòu)造函數(shù)
      • 子類沒有主構(gòu)造函數(shù)
      • 子類重寫父類的方法
      • 屬性重寫
    • 接口
      • 實(shí)現(xiàn)接口
      • 接口中的屬性
      • 接口繼承
      • 解決覆蓋沖突

繼承

在 Kotlin 中所有類都有一個(gè)共同的超類 Any,這對(duì)于沒有超類型聲明的類是默認(rèn)超類:

class Example // 從 Any 隱式繼承

Any 默認(rèn)提供了三個(gè)函數(shù):

equals() hashCode() toString()

子類有主構(gòu)造函數(shù)

如果一個(gè)類要被繼承,可以使用 open 關(guān)鍵字進(jìn)行修飾。

open class User(var age:Int)class Student(age: Int) : User(age)

代碼調(diào)用

var student = Student(100)Log.e("zhaoyanjun:", ""+ student.age ) //輸出結(jié)果

子類沒有主構(gòu)造函數(shù)

如果子類沒有主構(gòu)造函數(shù),則必須在每一個(gè)二級(jí)構(gòu)造函數(shù)中用 super 關(guān)鍵字初始化基類,或者在代理另一個(gè)構(gòu)造函數(shù)。初始化基類時(shí),可以調(diào)用基類的不同構(gòu)造方法。

open class User(var age: Int)class Student : User{constructor(age: Int):super(age) }

子類重寫父類的方法

如果父類的方法可以被子類重寫,可以使用 open 關(guān)鍵字進(jìn)行修飾。

open class User(var age: Int){//能夠被覆蓋 open fun run(){}//不能被覆蓋 fun run2(){} }class Student : User{constructor(age: Int):super(age)//子類重寫父類的方法override fun run() {super.run()} }

屬性重寫

如果父類允許某個(gè)屬性能夠被重寫,需要用 open 字段修飾。子類需要的屬性需要用 override 字段修飾。

子類可以用 var 來重寫父類 val , 反之則不行。因?yàn)橐粋€(gè) val 屬性本質(zhì)上聲明了一個(gè) getter 方法,而將其覆蓋為 var 只是在子類中額外聲明一個(gè) setter 方法。

open class User(var age: Int) {//允許子類重寫,用 open 修飾open val name: String? = null }class Student : User {//重寫父類的屬性,用 override 修飾override var name:String?=nullconstructor(age: Int) : super(age) }

接口

Kotlin 的接口與 Java 8 類似,既包含抽象方法的聲明,也包含實(shí)現(xiàn)。與抽象類不同的是,接口無法保存狀態(tài)。它可以有屬性但必須聲明為抽象或提供訪問器實(shí)現(xiàn)。

使用關(guān)鍵字 interface 來定義接口

interface MyInterface {fun bar()fun foo() {// 可選的方法體} }

實(shí)現(xiàn)接口

一個(gè)類或者對(duì)象可以實(shí)現(xiàn)一個(gè)或多個(gè)接口。

class Child : MyInterface {override fun bar() {// 方法體} }

接口中的屬性

你可以在接口中定義屬性。在接口中聲明的屬性要么是抽象的,要么提供訪問器的實(shí)現(xiàn)。在接口中聲明的屬性不能有幕后字段(backing field),因此接口中聲明的訪問器不能引用它們。

interface MyInterface {val prop: Int // 抽象的val propertyWithImplementation: Stringget() = "foo"fun foo() {print(prop)} }class Child : MyInterface {override val prop: Int = 29 }

接口繼承

一個(gè)接口可以從其他接口派生,從而既提供基類型成員的實(shí)現(xiàn)也聲明新的函數(shù)與屬性。很自然地,實(shí)現(xiàn)這樣接口的類只需定義所缺少的實(shí)現(xiàn):

interface Named {val name: String }interface Person : Named {val firstName: Stringval lastName: Stringoverride val name: String get() = "$firstName $lastName" }data class Employee(// 不必實(shí)現(xiàn)“name”override val firstName: String,override val lastName: String,val position: Position ) : Person

解決覆蓋沖突

實(shí)現(xiàn)多個(gè)接口時(shí),可能會(huì)遇到同一方法繼承多個(gè)實(shí)現(xiàn)的問題。例如

interface A {fun foo() { print("A") }fun bar() }interface B {fun foo() { print("B") }fun bar() { print("bar") } }class C : A {override fun bar() { print("bar") } }class D : A, B {override fun foo() {super<A>.foo()super<B>.foo()}override fun bar() {super<B>.bar()} }

上例中,接口 A 和 B 都定義了方法 foo() 和 bar()。 兩者都實(shí)現(xiàn)了 foo(), 但是只有 B 實(shí)現(xiàn)了 bar() (bar() 在 A 中沒有標(biāo)記為抽象, 因?yàn)闆]有方法體時(shí)默認(rèn)為抽象)。因?yàn)?C 是一個(gè)實(shí)現(xiàn)了 A 的具體類,所以必須要重寫 bar() 并實(shí)現(xiàn)這個(gè)抽象方法。

然而,如果我們從 A 和 B 派生 D,我們需要實(shí)現(xiàn)我們從多個(gè)接口繼承的所有方法,并指明 D 應(yīng)該如何實(shí)現(xiàn)它們。這一規(guī)則既適用于繼承單個(gè)實(shí)現(xiàn)(bar())的方法也適用于繼承多個(gè)實(shí)現(xiàn)(foo())的方法。


個(gè)人微信號(hào):zhaoyanjun125 , 歡迎關(guān)注

總結(jié)

以上是生活随笔為你收集整理的Kotlin实战指南五:继承、接口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。