構造流程
基類的成員數據初始化 >> 基類構造函數 >> 子類成員數據初始化 >> 子類構造函數
產生問題的原因
但是下面的結構違背了這種構造順序,子類的init的方法調用要在子類的構造函數之前執行。
public class BaseClass {
int id = 0;
String name = "";
public BaseClass() {
System.out.println("BaseClass construct");
/**
* 千萬不在構造函數中調用重載方法,成員數據初始化賦值順序和
* 構造函數調用順序,導致奇怪的問題。
*/
init();
}
protected void init() {
System.out.println("BaseClass.init");
}
}
public class InheritClass extends BaseClass {
int value = 0;
String desc;
public InheritClass() {
System.out.println("InheritClass construct");
}
@Override
protected void init() {
super.init();
/** 下面的複製操作會被變量的初始複製給覆蓋掉。
* 因爲init是在父類構造函數調用,當前類的成員數據還沒有初始化,
* 等到當前成員初始化時,會把下面的數據賦值又給覆蓋掉。*/
value = 8;
desc = "InheritClass";
System.out.println("InheritClass.init");
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("value", value)
.append("desc", desc)
.toString();
}
}
@Test
void test() {
InheritClass inheritClass = new InheritClass();
System.out.println(inheritClass.toString());
}
結果:
BaseClass construct
BaseClass.init
InheritClass.init
InheritClass construct
org.ziegler.javabase.thread.inherit.InheritClass@158d2680[value=0,desc=InheritClass]