從零開始的Kotlin之類和對象(一)

從零開始系列:java

構造器

主構造器

Koltin 中的類能夠有一個 主構造器,以及一個或多個 次構造器,主構造器是類頭部的一部分,位於類名稱以後函數

class Person constructor(firstName: String) {}

若是主構造器沒有任何註解,也沒有任何可見度修飾符,那麼constructor關鍵字能夠省略。
主構造器中不能包含任何代碼,初始化代碼能夠放在 初始化代碼段中,初始化代碼段使用 init關鍵字做爲前綴。this

class Person constructor(firstName: String) {
    init {
        System.out.print("FirstName is $firstName")
    }
}

注意:主構造器的參數能夠在初始化代碼段中使用,也能夠在類主體n定義的屬性初始化代碼中使用。
一種簡潔語法,能夠經過主構造器來定義屬性並初始化屬性值(能夠是var或val):code

class People(val firstName: String, val lastName: String) {
    //...
}

若是構造器有註解,或者有可見度修飾符,這時constructor關鍵字是必須的,註解和修飾符要放在它以前。對象

次構造器

使用constructor關鍵字做爲前綴:繼承

class Person {
    constructor(parent: Person) {
        parent.children.add(this )
    }
}

若是類有主構造器,那麼每一個次級構造器都必須委託給主構造器,要麼直接委託,要麼經過其餘次級構造器間接委託。委託到同一個類的另外一個構造器時,使用this關鍵字實現。element

class Person constructor(firstName: String) {
    constructor() : this("Hello") {
    }
}

若是一個非抽象類沒有聲明任何主構造器和次構造器,那麼它將帶有一個自動生成的,無參數的主構造器,可見度爲 public。get

對象

建立對象

調用類的構造器,調用方式和使用普通函數同樣:

val person = Person("Juhezi")

注意:Kotlin 沒有 new 關鍵字。

繼承

Kotlin 中全部類都有一個共同的超類Any,若是類聲明時沒有g指定超類,則默認爲Any

注意Any不是java.lang.Object,只有equals()hashCode()toString()三個方法。

Kotlin中使用:來實現繼承,而不是extends

open class Base(p: Int)
class Derived(p: Int): Base(p)

若是類有主構造器,那麼必須在主構造器中使用主構造器的參數來初始化父類。若是類沒有主構造器,那麼全部的次級構造器都必須使用superi關鍵字來初始化父類,或者委託到另外一個構造器,由被委託的構造器來初始化父類。

open關鍵字表示容許從這個類繼承出其餘子類,做用和final關鍵字做用相反。默認狀況下,Kotlin中全部的類都是 final 的。

抽象類

類自己,或類中的部分紅員,均可以聲明爲abstract的。抽象成員在類中不存在具體的實現。

注意:無需對抽象類或抽象成員標註open註解。

open class Base {
    open fun f() {}
}
abstract class Derived : Base() {
        override abstract fun f()
}

同伴對象(Companion Object)

Koltin沒有靜態方法(static method),可使用同伴對象代替。
若是在類中聲明一個同伴對象,那麼只須要使用類名就能夠調用調用同伴對象的成員了。

class Util {
    companion object {
        val element: String = "HelloWorld"
        fun sayHello() {
            System.out.println(element)
        }
    }
}

class Main {
    init {
        System.out.println(Util.element)
        Util.sayHello()
    }
}

封閉類

封閉類用來表示對類階層的限制,能夠限定一個值只容許是某些指定的類型之一,而不容許是其餘類型。

要聲明一個封閉類,須要將sealed修飾符放在類名以前,封閉類能夠有子類,但全部的子類聲明明都必須嵌套在封閉類的聲明部分以內。

sealed class Expr {
    class Const(val number: Double) : Expr()
    class Sum(val e1: Expr, val e2: Expr) : Expr()
    object NotANumber : Expr()
}

注意:從封閉類的子類再繼承的子類(間接繼承者)能夠放在任何地方,沒必要在封閉類的聲明部分以內。

相關文章
相關標籤/搜索