前提概念:kotlin中主級函數(shù)、次級函數(shù)概念理解
調(diào)用順序:主級函數(shù)>init>次級函數(shù)
詳細文章傳送門:https://blog.csdn.net/u011288271/article/details/106546490
內(nèi)容看不了可以直接看下面,我搬過來了,內(nèi)容如下↓
遇到了Kotlin: Primary constructor call expected的報錯
如果類有一個主構(gòu)造函數(shù),每個次構(gòu)造函數(shù)需要委托給主構(gòu)造函數(shù), 可以直接委托或者通過別的次構(gòu)造函數(shù)間接委托。委托到同一個類的另一個構(gòu)造函數(shù)用 this 關(guān)鍵字即可
這句話就是說如果一個類有主構(gòu)造函數(shù),只要他除了主構(gòu)造函數(shù)還有其他次構(gòu)造函數(shù),那么這些次構(gòu)造函數(shù)就必須調(diào)用主構(gòu)造函數(shù),方式可以不同
方式1:每個次構(gòu)造函數(shù)都調(diào)用主構(gòu)造函數(shù) : 即直接委托
class Parent(name: String) {
var age = 0;
var sex = "man"
constructor(name: String, age: Int) : this("Main name 1") {
this.age = age;
println("constructor 1 $name , $age , $sex")
}
constructor(nickName: String, sex: String) : this("Main name 2") {
this.sex = sex;
println("constructor 2 $nickName , $age , $sex")
}
open fun learn() {
println(" learn ")
}
}
fun main() {
Parent("lucy", "woman").learn()
}
如上代碼,每個constructor后面都顯示調(diào)用主構(gòu)造函數(shù) this("name ")
方式2:次構(gòu)造函數(shù)2 ————> 次構(gòu)造函數(shù)1 ,而 次構(gòu)造函數(shù)1 ————> 主構(gòu)造函數(shù) :即間接委托
最終: 次構(gòu)造函數(shù)2 ——間接——> 主構(gòu)造函數(shù)
所以無論你這種 次級構(gòu)造函數(shù) -> 次級構(gòu)造函數(shù) -> 次級構(gòu)造函數(shù) 調(diào)用了多少個,最終必須有一個次構(gòu)造函數(shù)調(diào)用主構(gòu)造函數(shù),否則就會報錯
如下代碼: constructor(nickName: String, sex: String) ——> constructor(name: String, age: Int) ——>主構(gòu)造函數(shù) this("Main name 1")
class Parent(name: String) {
var age = 0;
var sex = "man"
//次級構(gòu)造函數(shù)1
constructor(name: String, age: Int) : this("Main name 1") {
this.age = age;
println("constructor 1 $name , $age , $sex")
}
//次級構(gòu)造函數(shù)2
constructor(nickName: String, sex: String) : this("nickName jj", 12) {
this.sex = sex;
println("constructor 2 $nickName , $age , $sex")
}
open fun learn() {
println(" learn ")
}
}
fun main() {
Parent("lucy", "woman").learn()
}
如果一個類沒有主構(gòu)造函數(shù),次級構(gòu)造函數(shù)就不必顯示調(diào)用主構(gòu)造函數(shù)
class Parent {
init {
// 初始化代碼塊本質(zhì)就是主構(gòu)造函數(shù)的方法體
// 因為主構(gòu)造函數(shù)在類名頭部聲明不能帶有方法體
println("Main constructor")
}
constructor(sex: String) {
println("constructor , $sex")
}
open fun learn() {
println(" learn ")
}
}
fun main() {
Parent("woman").learn()
}
打印日志
image.png
你雖然沒有聲明主構(gòu)造函數(shù),但它會生成一個生成的不帶參數(shù)的主構(gòu)造函數(shù)。在你調(diào)用次級構(gòu)造函數(shù)時隱式調(diào)用,
就是你不用在代碼中寫,但它會在你調(diào)用次級構(gòu)造函數(shù)之前調(diào)用了。
在日志中
主函數(shù)方法體中的 Main constructor 首先打印,接著才是次級構(gòu)造函數(shù)中的 constructor , woman
雖然你在main()方法中通過次級構(gòu)造函數(shù)初始化Person類對象,但是他在次級構(gòu)造函數(shù)之前隱式調(diào)用了默認的無參主構(gòu)造函數(shù)
————————————————
版權(quán)聲明:本文為CSDN博主「本人很懶zzz」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u011288271/article/details/106546490
