一、類的構(gòu)造函數(shù)
在Kotlin中寿冕,允許有一個(gè)主構(gòu)造函數(shù)和多個(gè)二級(jí)構(gòu)造函數(shù)(輔助構(gòu)造函數(shù))谨读。其中主構(gòu)造函數(shù)是類頭的一部分。
關(guān)鍵字或者構(gòu)造函數(shù)名:constructor(參數(shù))
1晤锹、什么時(shí)候constructor可以省略
- 在構(gòu)造函數(shù)不具有注釋符或者默認(rèn)的可見性修飾符時(shí)摩幔,
constructor
關(guān)鍵字可以省略。- 默認(rèn)的可見性修飾符時(shí)
public
鞭铆』蚝猓可以省略不寫
// 類似下面兩種情況的,都必須存在constructor關(guān)鍵字车遂,并且在修飾符或者注釋符后面封断。
class Test private constructor(num: Int){
}
class Test @Inject constructor(num: Int){
}
2、輔助(二級(jí))構(gòu)造函數(shù)
Kotlin中支持二級(jí)構(gòu)造函數(shù)舶担。它們以constructor關(guān)鍵字作為前綴坡疼。
2.1、聲明
class Test{
constructor(參數(shù)列表){
}
}
2.2衣陶、同時(shí)存在主構(gòu)造函數(shù)和二級(jí)構(gòu)造函數(shù)時(shí)的情況
如果類具有主構(gòu)造函數(shù)柄瑰,則每個(gè)輔助構(gòu)造函數(shù)需要通過另一個(gè)輔助構(gòu)造函數(shù)直接或間接地委派給主構(gòu)造函數(shù)。 使用this關(guān)鍵字對(duì)同一類的另一個(gè)構(gòu)造函數(shù)進(jìn)行委派:
fun main(args: Array<String>) {
var test1 = Test(1)
var test2 = Test(1,2)
}
// 這里是為了代碼清晰祖搓,故而沒有隱藏constructor關(guān)鍵字
class Test constructor(num: Int){
init {
println("num = $num")
}
constructor(num : Int, num2: Int) : this(num) {
println(num + num2)
}
}
說明:二級(jí)構(gòu)造函數(shù)中的參數(shù)1(num)狱意,是委托了主構(gòu)造函數(shù)的參數(shù)num。
可以看出拯欧,當(dāng)實(shí)例化類的時(shí)候只傳1個(gè)參數(shù)的時(shí)候详囤,只會(huì)執(zhí)行init代碼塊中的代碼。當(dāng)傳2個(gè)參數(shù)的時(shí)候,除了執(zhí)行了init代碼塊中代碼外藏姐,還執(zhí)行了二級(jí)構(gòu)造函數(shù)中的代碼隆箩。
輸出結(jié)果為:
num = 1
num = 1
3
2.3、當(dāng)類的主構(gòu)造函數(shù)都存在默認(rèn)值時(shí)的情況
- 在JVM上羔杨,如果類主構(gòu)造函數(shù)的所有參數(shù)都具有默認(rèn)值捌臊,編譯器將生成一個(gè)額外的無參數(shù)構(gòu)造函數(shù),它將使用默認(rèn)值兜材。 這使得更容易使用Kotlin與諸如Jackson或JPA的庫(kù)理澎,通過無參數(shù)構(gòu)造函數(shù)創(chuàng)建類實(shí)例。
- 同理可看出曙寡,當(dāng)類存在主構(gòu)造函數(shù)并且有默認(rèn)值時(shí)糠爬,二級(jí)構(gòu)造函數(shù)也適用