Kotlin 創(chuàng)建接口或者抽象類的匿名對(duì)象實(shí)例
一 ,定義接口和抽象類
interface IPerson{ //獲取名字 fun getName():String //獲取身份證ID fun getID():String } abstract class BaseAnimal{ abstract fun getVoice():String }
二,創(chuàng)建對(duì)應(yīng)的匿名對(duì)象
object : IPerson { override fun getName(): String = "jason" override fun getID(): String = "00000123" } object : BaseAnimal() { override fun getVoice() = "旺旺叫" }
補(bǔ)充知識(shí):android Kotlin 繼承、派生、接口、構(gòu)造方式,方法、屬性重寫
前言
kotlin 作為google官方android 開發(fā)語(yǔ)言,大勢(shì)所趨,據(jù)傳到2018底kotlin要全面替代java在android中的地位,其實(shí)這個(gè)也不擔(dān)心畢竟kotin和java可以100%互操作。兩種語(yǔ)言進(jìn)行編寫也是可以的。
Kotlin 繼承
1.使用 open 關(guān)鍵字進(jìn)行修飾
2.主構(gòu)造函數(shù)緊跟著在類后面聲明的函數(shù)
open class Person(var name : String, var age : Int){// 基類 } class Student(name : String, age : Int, var no : String, var score : Int) : Person(name, age) { } // 二級(jí)構(gòu)造函數(shù) calss Student : Person { constructor(ctx: Context) : super(ctx) { } constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) { } }
另一種寫法,基類構(gòu)造函數(shù),次級(jí)構(gòu)造函數(shù)
/**用戶基類**/ open class Person(name:String){ /**次級(jí)構(gòu)造函數(shù)**/ constructor(name:String,age:Int):this(name){ //初始化 println("-------基類次級(jí)構(gòu)造函數(shù)---------") } } /**子類繼承 Person 類**/ class Student:Person{ /**次級(jí)構(gòu)造函數(shù)**/ constructor(name:String,age:Int,no:String,score:Int):super(name,age){ println("-------繼承類次級(jí)構(gòu)造函數(shù)---------") println("學(xué)生名: ${name}") println("年齡: ${age}") println("學(xué)生號(hào): ${no}") println("成績(jī): ${score}") } } fun main(args: Array<String>) { var s = Student("Runoob", 18, "S12345", 89) }
方法重寫
基類fun函數(shù)默認(rèn) final 修飾符,無法在子類進(jìn)行重寫
需要加上 open 修飾符號(hào)
方法獲得,同名方法獲得
一個(gè)類從其他類或者接口(繼承實(shí)現(xiàn)來的方法),同名方法,在子類中必須顯示進(jìn)行調(diào)用
open class A { open fun f () { print("A") } fun a() { print("a") } } interface B { fun f() { print("B") } //接口的成員變量默認(rèn)是 open 的 fun b() { print("b") } } class C() : A() , B{ override fun f() { super<A>.f()//調(diào)用 A.f() super<B>.f()//調(diào)用 B.f() } } fun main(args: Array<String>) { val c = C() c.f(); } open class A { open fun f () { print("A") } fun a() { print("a") } } interface B { fun f() { print("B") } //接口的成員變量默認(rèn)是 open 的 fun b() { print("b") } } class C() : A() , B{ override fun f() { super<A>.f()//調(diào)用 A.f() super<B>.f()//調(diào)用 B.f() } } fun main(args: Array<String>) { val c = C() c.f(); }
屬性重寫
屬性重寫使用 override 關(guān)鍵字,屬性必須具有兼容類型,每一個(gè)聲明的屬性都可以通過初始化程序或者getter方法被重寫:
open class Foo { open val x: Int get { …… } } class Bar1 : Foo() { override val x: Int = …… }
你可以用一個(gè)var屬性重寫一個(gè)val屬性,但是反過來不行。因?yàn)関al屬性本身定義了getter方法,重寫為var屬性會(huì)在衍生類中額外聲明一個(gè)setter方法
你可以在主構(gòu)造函數(shù)中使用 override 關(guān)鍵字作為屬性聲明的一部分:
interface Foo { val count: Int } class Bar1(override val count: Int) : Foo class Bar2 : Foo { override var count: Int = 0 }
Kotlin 接口
Kotlin 接口與 Java 8 類似,使用 interface 關(guān)鍵字定義接口,允許方法有默認(rèn)實(shí)現(xiàn):
interface MyInterface { fun bar() // 未實(shí)現(xiàn) fun foo() { //已實(shí)現(xiàn) // 可選的方法體 println("foo") } }
接口中的屬性
接口中的屬性只能是抽象的,不允許初始化值,接口不會(huì)保存屬性值,實(shí)現(xiàn)接口時(shí),必須重寫屬性:
interface MyInterface{ var name:String //name 屬性, 抽象的 } class MyImpl:MyInterface{ override var name: String = "runoob" //重載屬性 }
函數(shù)重寫
實(shí)現(xiàn)多個(gè)接口時(shí),可能會(huì)遇到同一方法繼承多個(gè)實(shí)現(xiàn)的問題。例如:
實(shí)例
interface A { fun foo() { print("A") } // 已實(shí)現(xiàn) fun bar() // 未實(shí)現(xiàn),沒有方法體,是抽象的 } interface B { fun foo() { print("B") } // 已實(shí)現(xiàn) fun bar() { print("bar") } // 已實(shí)現(xiàn) } 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() } } fun main(args: Array<String>) { val d = D() d.foo(); d.bar(); }
輸出結(jié)果為:
ABbar
實(shí)例中接口 A 和 B 都定義了方法 foo() 和 bar(), 兩者都實(shí)現(xiàn)了 foo(), B 實(shí)現(xiàn)了 bar()。因?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())的方法。
以上這篇Kotlin 創(chuàng)建接口或者抽象類的匿名對(duì)象實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android Studio實(shí)現(xiàn)簡(jiǎn)單的通訊錄
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)簡(jiǎn)單的通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04Android中LayoutInflater.inflater()的正確打開方式
這篇文章主要給大家介紹了關(guān)于Android中LayoutInflater.inflater()的正確打開方式,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-1225個(gè)實(shí)用酷炫的Android開源UI框架
本文為大家分享了25個(gè)實(shí)用酷炫的Android開源UI框架,靈活運(yùn)用這些UI框架可在日常工作中節(jié)省不少時(shí)間2018-04-04Android指紋識(shí)別認(rèn)識(shí)和基本使用詳解
這篇文章主要為大家詳細(xì)介紹了Android指紋識(shí)別認(rèn)識(shí)和基本的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Android Studio連接手機(jī)設(shè)備教程
這篇文章主要為大家詳細(xì)介紹了Android Studio連接手機(jī)設(shè)備教程,非常完整的連接步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07關(guān)于Android Studio安裝完后activity_main.xml前幾行報(bào)錯(cuò)的解決建議
這篇文章主要介紹了關(guān)于Android Studio安裝完后activity_main.xml前幾行報(bào)錯(cuò)的解決建議,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03android使用PopupWindow實(shí)現(xiàn)頁(yè)面點(diǎn)擊頂部彈出下拉菜單
這篇文章主要給大家介紹android使用PopupWindow實(shí)現(xiàn)頁(yè)面點(diǎn)擊頂部彈出下拉菜單,實(shí)現(xiàn)此功能主要通過PopupWindow方法,代碼也很簡(jiǎn)單,需要的朋友可以參考下2015-08-08