在關鍵字一——var和val中最后提到了構造函數,這里就學習下構造函數相關的關鍵字: constructor和init。
主要構造(primary constructor)
kotlin和java一樣,在定義類時就自動生成了無參構造
// 會生成默認的無參構造函數
class Person{
}
與java不同的是,當kotlin的構造函數中必須帶參數時,則需要在類名后面直接添加參數:
class Person(var name:String, var age:Int){
}
這種在類名后面添加參數(包含無參)的構造方法就稱為主要構造(primary constructor)
次要構造(secondary constructor)
當類包含多個構造函數時,需要通過次要構造實現, 次要構造需要用constructor關鍵字修飾:
// primary constructor
class Person(var age: Int, var name: String) {// secondary constructorconstructor(name: String) : this(18, name = name)
}
次要構造使用上需要注意:
- 次要構造需要直接或間接調用主要構造
// primary constructor class Person(var age: Int, var name: String) {// 會提示: Primary constructor call expectedconstructor(name: String) }
- 次要構造中不能聲明類的屬性,即不能使用var或val
class Person(var age: Int, var name: String) {constructor(name: String) : this(age = 18, name)// 提示'var' on secondary constructor parameter is not allowedconstructor(var address:String, name: String):this(name) }
init
kotlin提供了一個方法init,當有多個構造方法,無論使用哪個構造方法都會調用到init方法:
// 調用 Person("xiao ming")或者 Person(16, "小明")后 都會輸出
// I am a person
class Person(var age: Int, var name: String) {constructor(name: String) : this(age = 18, name)init {System.out.println("I am a person")}
}
可以看下實現原理:
public final class Person {public Person(int age, @NotNull String name) {super();this.age = age;this.name = name;// init方法System.out.println("I am a person");}public Person(@NotNull String name) {this(18, name);}
}
可以看到kotlin構造的執行順序是
主構造——>init()——>次要構造