如果在init中使用了成員變量,那么成員變量一定要定義在init之前,否則會(huì)爆Variable cannot be initialized before declaration 錯(cuò)誤
不管調(diào)用哪個(gè)次級(jí)構(gòu)造函數(shù),都是先執(zhí)行主構(gòu)造函數(shù)(初始化成員變量和執(zhí)行init代碼塊),再執(zhí)行次級(jí)構(gòu)造函數(shù)代碼。所以kotlin規(guī)定次級(jí)構(gòu)造函數(shù)先要委托給主構(gòu)造函數(shù)。
成員變量初始化和init代碼塊誰(shuí)先執(zhí)行是按它們的聲明順序來(lái)的。
class InitTest {
private var num1 = 2
init {
num1 = 3
println("init方法:$num1")
}
init {
// num2 = 5
println("init方法2")
}
constructor() {
println("構(gòu)造函數(shù)1")
}
constructor(params: String) {
println("構(gòu)造函數(shù)2")
}
private var num2 = 4
}
public final class InitTest {
private int num1;
private int num2;
public InitTest() {
this.num1 = 2;
this.num1 = 3;
String var1 = "init方法:" + this.num1;
System.out.println(var1);
var1 = "init方法2";
System.out.println(var1);
this.num2 = 4;
var1 = "構(gòu)造函數(shù)1";
System.out.println(var1);
}
public InitTest(@NotNull String params) {
Intrinsics.checkNotNullParameter(params, "params");
super();
this.num1 = 2;
this.num1 = 3;
String var2 = "init方法:" + this.num1;
System.out.println(var2);
var2 = "init方法2";
System.out.println(var2);
this.num2 = 4;
var2 = "構(gòu)造函數(shù)2";
System.out.println(var2);
}
}
// InitTestKt.java
package com.lcf.study;
import kotlin.Metadata;
@Metadata(
mv = {1, 9, 0},
k = 2,
d1 = {"\u0000\b\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001¨\u0006\u0002"},
d2 = {"main", "", "leetCodeJava"}
)
public final class InitTestKt {
public static final void main() {
new InitTest("222222222");
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。