日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Kotlin——繼承

Kotlin中所有的類都有一個公有的超類:Any,這是所有沒有聲明超類的類的默認(rèn)父類。

臨翔網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。創(chuàng)新互聯(lián)于2013年創(chuàng)立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

 
 
 
 
  1. class Example //隱式繼承自Any 

Any!=Java.lang.Object。尤其,除了equals()、hashCode()和toString()三個方法外,沒有任何成員。

為了顯式地聲明超類,語法如下:

 
 
 
 
  1. open class Base(p:Int) 
  2.  
  3. class Derived(p:Int):Base(p) 

如果類具有主構(gòu)造器,則可以使用主構(gòu)造器的參數(shù)(并且必須)初始化父類。

如果類沒有主構(gòu)造器,那么每個輔助構(gòu)造器初始化時需要使用super關(guān)鍵字,或者將其委托給其他構(gòu)造器。需要注意的是,在這種情況下,不同的輔助構(gòu)造器可以調(diào)用基類的不同構(gòu)造器。

 
 
 
 
  1. class MyView:View{ 
  2.  
  3. constructor(ctx:Context):super(ctx) 
  4.  
  5. constructor(ctx:Context,attrs:AttributeSet):super(ctx,attrs) 
  6.  

open注解和Java的final相反:它允許其他類繼承自該類。默認(rèn)的,Kotlin中所有的類是final的,也就是說不能繼承的。

覆寫方法

Kotlin總是做一些明確的事情,不像Java,Kotlin要求復(fù)寫方法時需要顯式的注解和重寫:

 
 
 
 
  1. open class Base { 
  2.     open fun v() { 
  3.         println("Base.v()") 
  4.     } 
  5.  
  6.     fun nv() { 
  7.         println("Base.nv") 
  8.     } 
  9.  
  10.  
  11. class Derived() : Base() { 
  12.  
  13.     override fun v() { 
  14.         println("Derived.v()") 
  15.     } 
  16.  

復(fù)寫Derived的v()時,ovverride注解是必須的,否則編譯器會報錯。如果沒有open注解,比如Base的nv(),那么在子類中是不能覆寫該方法的。在一個final類中(沒有open注解聲明),open成員是禁止的。也就是說final類的每個成員也都是final的。

一個標(biāo)記為override的成員自身就是open的,子類仍然可以覆寫它。如果你想禁止覆寫,那么使用final

 
 
 
 
  1. open class AnotherDerived() : Base() { 
  2.     final override fun v() { 
  3.         println("AnotherDerived.v") 
  4.     } 

***,main()驗證多態(tài)性:

 
 
 
 
  1. fun main(args: Array) { 
  2.  
  3.     var base1: Base = Base() 
  4.     var base2: Base = Derived() 
  5.     var base3: Base = AnotherDerived() 
  6.  
  7.     base1.v() 
  8.     base2.v() 
  9.     base3.v() 
  10.  

覆寫屬性

覆寫屬性和覆寫方法基本類似;如果子類要重新聲明父類中已經(jīng)聲明過的屬性,那么需要使用override,并且類型要兼容。每個聲明的屬性可以被具有初始化器的屬性或具有g(shù)etter方法的屬性覆蓋。

 
 
 
 
  1. open class Foo { 
  2.     open val x: Int 
  3.         get() { 
  4.             println("Foo") 
  5.             return 3 
  6.         } 
  7.  
  8. class Bar1 : Foo() { 
  9.     override val x: Int = 2 

可以使用var屬性覆蓋val屬性,反之不可以。因為val屬性基本上聲明一個getter方法,并將其替換為var,另外在派生類中聲明一個setter方法。

可以在主構(gòu)造器使用override覆蓋屬性

 
 
 
 
  1. interface Aoo { 
  2.     val count: Int 
  3.  
  4. class Aoo1(override val count: Int) : Aoo 
  5.  
  6. class Aoo2 : Aoo { 
  7.     override var count: Int = 0 

覆寫準(zhǔn)則

在Kotlin中,實現(xiàn)繼承由以下規(guī)則控制:如果類從其直接超類繼承同一成員的多個實現(xiàn),則它必須覆蓋該成員并提供自己的實現(xiàn)(可能使用其中一個繼承)。 要表示從其繼承的實現(xiàn)的超類型,可在尖括號中使用超類型名稱超級限定,例如,super。

 
 
 
 
  1. open class A { 
  2.     open fun f() { 
  3.         println("A") 
  4.     } 
  5.  
  6.     fun a() { 
  7.         println("a") 
  8.     } 
  9.  
  10.  
  11. //接口的方法默認(rèn)open 
  12. interface B { 
  13.     fun f() { 
  14.         println("B") 
  15.     } 
  16.  
  17.     fun b() { 
  18.         println("b") 
  19.     } 
  20.  
  21.  
  22. class C() : A(), B { 
  23.     override fun f() { 
  24.         super.f() 
  25.         super.f() 
  26.         println("C") 
  27.     } 

上面的代碼繼承自A和B是沒有問題的,a()和b()因為C知道繼承自哪一個類。但是對于f(),我們有兩個繼承,所以我們需要覆寫f(),并且需要提供我們的實現(xiàn)來消除歧義。

總結(jié)

Kotlin中的類默認(rèn)是final的,如果需要子類繼承,需要使用open修飾;

Kotlin中的方法默認(rèn)是不允許復(fù)寫的,只有用open修飾時,子類才可以進(jìn)行覆寫,并且需要使用override進(jìn)行顯示標(biāo)注

屬性也支持覆寫


網(wǎng)頁標(biāo)題:Kotlin——繼承
網(wǎng)頁路徑:
http://m.5511xx.com/article/cocppee.html