從零開始系列:java
從零開始的Kotlin之類和對象(一)segmentfault
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)
若是類有主構造器,那麼必須在主構造器中使用主構造器的參數來初始化父類。若是類沒有主構造器,那麼全部的次級構造器都必須使用super
i關鍵字來初始化父類,或者委託到另外一個構造器,由被委託的構造器來初始化父類。
open
關鍵字表示容許從這個類繼承出其餘子類,做用和final
關鍵字做用相反。默認狀況下,Kotlin中全部的類都是 final 的。
類自己,或類中的部分紅員,均可以聲明爲abstract
的。抽象成員在類中不存在具體的實現。
注意:無需對抽象類或抽象成員標註open
註解。
open class Base { open fun f() {} } abstract class Derived : Base() { override abstract fun f() }
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() }
注意:從封閉類的子類再繼承的子類(間接繼承者)能夠放在任何地方,沒必要在封閉類的聲明部分以內。