1. 程式人生 > >Kotlin類和物件

Kotlin類和物件

“用Kotlin開發android更簡潔( ̄_, ̄ )”

官方文件

翻譯文件

類和繼承

類的申明

和java一樣可以用這種方式

class Empty {
    
}

//kotlin提供了一種更為簡潔的方式建立無實體型別
class Empty

建構函式

在 Kotlin 中類可以有一個主建構函式以及多個二級建構函式。主建構函式是類頭的一部分:跟在類名後面(可以有可選的引數)。

class Empty constructor(name: String) {
    
}
//如果想建立無參建構函式,都必須給它指定初始值
class Empty constructor(name: String = "") {
    
}

constructor 這個關鍵字官方是這樣解釋的

Here the constructor is private. By default, all constructors are public, which effectively amounts to them being visible everywhere where the class is visible (i.e. a constructor of an internal class is only visible within the same module).
這裡的建構函式是私有的。預設情況下,所有的建構函式都是公開的,有效的,它們可以在任何地方都可見(即一個內部類的建構函式在同一個模組中可見)。

如果主建構函式沒有註解或可見性說明,則 constructor 關鍵字是可以省略:

主建構函式不能包含任何程式碼,必須在init方法裡

class Empty constructor(name: String) {

    init {
        Log.d(this.javaClass.name, "name =$name")
    }
}

二級建構函式

//如果建構函式沒有引數

class Empty {
    constructor(empty: Empty) {
    }
}

//如果類有主建構函式,每個二級建構函式都要,或直接或間接通過另一個二級建構函式代理主建構函式。
//在同一個類中代理另一個建構函式使用 this 關鍵字:

class Empty(name: String) {


    init {
        Log.d(this.javaClass.name, "name =$name")
    }

    constructor(name: String, empty: Empty) : this(name) {

    }

}

類的建立

Kotlin 沒有new

var empty = Empty("A")
var empty = Empty()//無參則需要在建構函式中指明初始值

繼承

在Kotin 中所有的類都有共同的父類Any ,Any 不是 java.lang.Object,事實上它除了 equals(),hashCode()以及toString()外沒有任何成員了

//類名 :父類,再加上建構函式的引數,可惜外掛不太方便自動生成建構函式,希望能夠改進

class KotlinTextView : TextView {
    constructor(ctx: Context) : super(ctx) {//super 和 java裡面的概念一樣
    }

    constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) {
    }
}

複寫成員

想要能夠複寫父類方法,都必須明確的註解出來

open class Empty(name: String = "") {//父類需要宣告open關鍵字


    init {
        Log.d(this.javaClass.name, "name =$name")
    }

    constructor(name: String, empty: Empty) : this(name) {

    }

    open fun hello() {//方法也必須宣告open

    }

    class NewEmpty() : Empty() {
        override fun hello() {//複寫的話需要和java一樣有override關鍵字,兩個open缺一不可
            super.hello()
        }
    }
}

如果不想被重寫則可以加上final

 open class NewEmpty() : Empty() {
        final override fun hello() {//加上了final關鍵字
            super.hello()
        }
    }

    class NewE() : NewEmpty() {
        override fun hello() {//此時編譯器會提示錯誤
            super.hello()
        }
    }

複寫規則

在 kotlin 中,實現繼承通常遵循如下規則:如果一個類從它的直接父類繼承了同一個成員的多個實現,那麼它必須複寫這個成員並且提供自己的實現(或許只是直接用了繼承來的實現)。

  interface SayHello {
        fun hello() {
            Log.d("SayHello", "SayHello!!!!!!")
        }
    }

    open class NewEmpty() : Empty(), SayHello {
        final override fun hello() {
            super<Empty>.hello()    //可以選擇性的用誰的父類方法
            super<SayHello>.hello()//為表示使用父類中提供的方法我們用 super<class>表示
        }
    }

抽象類

一個類或一些成員可能被宣告成 abstract 。一個抽象方法在它的類中沒有實現方法。因此當子類繼承抽象成員時,它並不算一個實現:

abstract class I_Say {
    abstract fun hello() //抽象類定義不能作為實現,而介面(interface )可以
}

class Chinese() : I_Say() {
    override fun hello() {
        Log.d("SampleActivity2", "你好")
    }
}

class English() : I_Say() {
    override fun hello() {
        Log.d("SampleActivity2", "hello")
    }