一個對象實例化的過程(假設對象是Person):
Person p = new Person();
- jvm會讀取指定路徑下的Person.class文件,並加載進內存,並會先加載Person的父類(如果有直接父類的情況下)
- 在堆內存中開闢空間,分配地址。
- 並在對象空間中,對對象中的屬性進行默認初始化。
- 調用對應的構造函數進行初始化。
- 在構造函數中,第一行會先調用父類中的構造函數進行初始化。
- 父類初始化完畢後,再對子類的屬性進行顯示初始化。
- 再進行子類構造函數的特定初始化。
- 初始化完畢後,將地址值賦給引用變量。
案例:
class Fu
{
Fu()
{
super();
show();
return;
}
void show()
{
System.out.println("fu show");
}
}
class Zi extends Fu
{
int num = 8;
Zi()
{
super();
//-->通過super初始化父類內容時,子類的成員變量並未顯式初始化。等super()父類初始化完畢後,才進行子類成員變量顯式初始化。
System.out.println("zi cons run..." + num);
return;
}
void show()
{
System.out.println("zi show..." + num);
}
}
class ExtendsDemo5
{
public static void main(String[] args)
{
Zi z = new Zi();//輸出答案爲zi show...0 + zi cons run...8
z.show();//輸出答案爲zi show...8
/*
zi show...0//父類構造函數初始化,子類show方法覆蓋父類show方法,調用子類的show方法,此時成員變量並未初始化
zi cons run...8
zi show...8
*/
}
}