日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )

發(fā)布時(shí)間:2025/6/17 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 ) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

        • I . 接口總結(jié)
        • II . 接口聲明
        • III . 接口實(shí)現(xiàn)
        • IV . 接口中的方法
        • V . 接口中的屬性 ( 變量 / 常量 )
        • VI . 接口中的屬性屬性覆蓋 ( 變量 / 常量 )
        • VII . 接口覆蓋沖突問題
        • VIII . 接口繼承接口



I . 接口總結(jié)



接口總結(jié) :


① 聲明與實(shí)現(xiàn) : 使用 interface 關(guān)鍵字聲明接口 , 實(shí)現(xiàn)時(shí)需要重寫所有的抽象成員 ( 屬性 / 方法 ) ;

② 接口成員 : 接口中的 正常成員屬性和成員方法默認(rèn)使用 open 關(guān)鍵字修飾 , 接口中的抽象成員屬性和抽象成員方法默認(rèn)使用 abstract open 關(guān)鍵字修飾 ;

③ 接口屬性及覆蓋 : 變量屬性聲明成抽象屬性 , 常量屬性可以聲明成抽象屬性 , 也可以添加訪問器 ;

④ 接口覆蓋沖突問題 : 實(shí)現(xiàn)類實(shí)現(xiàn)多個(gè)接口 , 使用 super<接口名稱> 調(diào)用不同接口的正常方法 ;



II . 接口聲明



1 . 接口聲明 : 接口使用 interface 接口名稱 格式定義 ;


① 接口默認(rèn) open 修飾 : 接口 , 默認(rèn)使用 open 關(guān)鍵字修飾 , 可以直接繼承 ;

② 接口方法默認(rèn) open 修飾 : 接口中的方法 , 默認(rèn)使用 open 關(guān)鍵字修飾 , 可以直接 override 重寫 ; 抽象方法可以省略 abstract 關(guān)鍵字修飾 ;

② 接口屬性默認(rèn) open 修飾 : 接口中的屬性 , 默認(rèn)使用 open 關(guān)鍵字修飾 , 可以直接 override 重寫 ; 抽象屬性可以省略 abstract 關(guān)鍵字修飾 ;

//定義接口 interface Intf{}

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



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


① 沒有構(gòu)造函數(shù)委托 : 實(shí)現(xiàn)接口時(shí)不用調(diào)用其構(gòu)造函數(shù) , 因此在子類聲明時(shí) , 接口名稱后沒有括號 ;

② 必須重寫抽象方法與抽象屬性 : 接口中的沒有初始化的屬性是抽象屬性 , 沒有方法體的方法是抽象方法 , 其省略了 abstract 和 open 關(guān)鍵字 ;

//接口定義 interface Intf{//抽象屬性var age : Int//抽象方法fun action_abstract()}//接口實(shí)現(xiàn) , 注意沒有構(gòu)造函數(shù)委托 class Impl : Intf {//重寫抽象屬性override var age: Int = 18//重寫抽象方法override fun action_abstract() {println("Impl : action_abstract")} }

IV . 接口中的方法



1 . 接口中的方法 : 接口中的方法默認(rèn)使用 open 修飾 , 可以直接在實(shí)現(xiàn)類中重寫覆蓋 ;


① 抽象方法 : 接口中可以定義抽象方法 , 接口中沒有方法體的抽象方法可以省略 abstract 關(guān)鍵字 , 所有方法默認(rèn)使用 open 修飾 ;

② 正常方法 : 也可以定義普通的方法 , 普通方法默認(rèn)使用 open 修飾 ;

③ 與 Java 對比 : 這一點(diǎn)與 Java 不同 , Java 中接口必須都是抽象方法 ;

interface Intf{//接口中的方法默認(rèn)使用 abstract 修飾fun action_abstract()//接口中可以定義正常方法fun action_real(){println("action_real")} }

2 . 接口中方法重寫 : 重寫的方法必須使用 override 關(guān)鍵字修飾 ;

//接口定義 interface Intf{//接口中的方法默認(rèn)使用 abstract open 修飾fun action_abstract()//接口中可以定義正常方法 , 默認(rèn)使用 open 修飾fun action_real(){println("Intf : action_real")} }//接口實(shí)現(xiàn)類 abstract class Impl : Intf {//實(shí)現(xiàn)類中實(shí)現(xiàn)接口的抽象方法override fun action_abstract() {println("Impl : action_abstract")}//實(shí)現(xiàn)類中重寫接口中的正常方法override fun action_real() {super.action_real()println("Impl : action_real")} }

V . 接口中的屬性 ( 變量 / 常量 )



1 . 接口屬性 : 接口無法實(shí)例化 , 無法保存狀態(tài) , 接口中的屬性不能初始化 , 此時(shí)有兩種選擇 : ① 將該屬性定義成抽象的 ( 變量常量都可 ) , ② 提供 get 方法 ( 只有常量才可以 ) ;


① 抽象屬性 ( 變量 / 常量 ) : 被 abstract 修飾的 常量 var 或 變量 val 屬性 , 沒有初始化值 , 沒有 getter 和 setter 方法 ;

interface Intf{//抽象屬性 常量 , 默認(rèn)被 abstract open 修飾 ( 可省略 )abstract open val age : Int//抽象屬性 變量 , 默認(rèn)被 abstract open 修飾 ( 可省略 )abstract open var name : String }

② 省略的修飾符 ( 變量 / 常量 ) : 接口中的屬性和方法默認(rèn)自帶 open 修飾符 , 接口中的抽象屬性 和 抽象方法 可以省略 abstract , 因此這里可以省略 open 和 abstract 關(guān)鍵字 , 加上也不會出錯(cuò) ;

( 下面的抽象屬性與 ① 中的抽象屬性是等價(jià)的 )

interface Intf{//抽象屬性 常量 , 默認(rèn)被 abstract open 修飾 ( 可省略 )val age : Int//抽象屬性 變量 , 默認(rèn)被 abstract open 修飾 ( 可省略 )var name : String }

③ 提供訪問器 ( 常量 ) : 可以給屬性提供一個(gè)訪問器 , 但是明顯接口無法實(shí)例化 , 該訪問器調(diào)用不了 ;

( 常量可以提供一個(gè)訪問器 , 變量只能定義成抽象屬性 )

interface Intf{//抽象屬性 常量 , 常量可以提供一個(gè)訪問器val age : Intget() = 18//抽象屬性 變量 , 變量只能聲明成抽象屬性 , 不能添加訪問器var name : String }

VI . 接口中的屬性屬性覆蓋 ( 變量 / 常量 )



接口中的屬性覆蓋 :


① 抽象屬性 : 接口中的 變量 / 常量 屬性可以聲明成抽象的 ;

② 關(guān)于訪問器 : 只有常量才能使用添加訪問器替代抽象屬性方案 , 變量不能添加訪問器 ;

③ 常量與變量 : 覆蓋屬性 , 可以使用變量覆蓋常量 , 反過來不行 , 變量只能使用變量覆蓋 ;

//1 . 接口定義 interface Intf{//抽象屬性 常量 , 默認(rèn)被 abstract open 修飾 ( 可省略 )//常量可以提供一個(gè)訪問器 , 變量只能聲明成抽象屬性 , 不能添加訪問器val age : Int//抽象屬性 變量 , 默認(rèn)被 abstract open 修飾 ( 可省略 )//常量可以提供一個(gè)訪問器 , 變量只能聲明成抽象屬性 , 不能添加訪問器var name : String }//2 . 接口實(shí)現(xiàn)類 abstract class Impl : Intf {//覆蓋屬性 , 可以使用變量覆蓋常量 , 反過來不行override var age: Int = 18//覆蓋屬性 , 變量只能使用變量覆蓋override var name: String = "Tom" }

VII . 接口覆蓋沖突問題



1 . 接口覆蓋沖突問題描述 : 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口 , 如果多個(gè)接口中出現(xiàn)相同函數(shù)簽名的函數(shù) ( 正常帶方法體的函數(shù) ) , 如何調(diào)用不同接口的相同簽名函數(shù) ; ( 注意 : 這里調(diào)用的方法是有方法體的正常方法 )


2 . 覆蓋沖突解決方案 : 可以通過 super<接口名> 調(diào)用不同接口的正常方法 ;


3 . 代碼示例 : Intf1 和 Intf2 接口中都定義了非抽象函數(shù) action_real , Impl 類實(shí)現(xiàn)了兩個(gè)接口 , 通過使用 super.action_real() 調(diào)用 Intf1 中的 action_real 方法 , 通過使用 super.action_real() 調(diào)用 Intf2 中的 action_real 方法

//接口 1 定義 interface Intf1{fun action_abstract()fun action_real(){println("Intf1 : action_real")} }//接口 2 定義 interface Intf2{fun action_abstract()fun action_real(){println("Intf2 : action_real")} }//實(shí)現(xiàn)兩個(gè)接口 class Impl : Intf1 , Intf2 {override fun action_abstract() {println("Impl : action_abstract")}override fun action_real() {//調(diào)用 Intf1 接口中的 action_real 方法super<Intf1>.action_real()//調(diào)用 Intf2 接口中的 action_real 方法super<Intf2>.action_real()} }

VIII . 接口繼承接口



接口繼承接口 :


① 派生接口繼承 : 一個(gè)接口可以繼承另一個(gè)接口 , 派生接口擁有基類接口的成員 ;

② 派生接口新成員 : 派生接口聲明新的接口成員和屬性 ;

③ 子類實(shí)現(xiàn)派生接口 : 需要實(shí)現(xiàn)兩個(gè)接口的所有的抽象成員 ( 屬性 / 方法 ) ;

//接口定義 interface Intf1{//抽象屬性var age : Int//抽象方法fun action_abstract() }//接口定義 interface Intf2 : Intf1{//抽象屬性var name : String//抽象方法fun action_abstract2() }//接口實(shí)現(xiàn) , 注意沒有構(gòu)造函數(shù)委托 //需要實(shí)現(xiàn) Intf1 和 Intf2 中的抽象成員 class Impl : Intf2 {override var name: String = "Tom"override var age: Int = 18override fun action_abstract() {println("Impl : action_abstract")}override fun action_abstract2() {println("Impl : action_abstract")} }

總結(jié)

以上是生活随笔為你收集整理的【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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