一個對象的實例化過程:
Person p = new Person();
1,JVM會讀取指定的路徑下的Person.class文件,並加載進內存,並會先加載Person的父類(如果有直接的父類的情況下).
2,在堆內存中開辟空間,分配地址。
3,並在對象空間中,對對象中的屬性進行默認初始化。
4,調用對應的構造函數進行初始化。
5,在構造函數中,第一行會先調用父類中構造函數進行初始化。
6,父類初始化完畢后,再對子類的屬性進行顯示初始化。
7,進行子類構造函數的特定初始化。
8,初始化完畢后,將地址值賦值給引用變量Person p.
例:(面試,一個很說明問題的例子)
1 class Fu 2 { 3 Fu() 4 { 5 super(); 6 show(); //通過結果可以看出,子父類有同名show方法,調用的是子類show方法。 7 return; 8 } 9 10 void show() 11 { 12 System.out.println("fu show"); 13 } 14 } 15 class Zi extends Fu 16 { 17 int num = 8; 18 Zi() 19 { 20 super(); 21 //-->通過super初始化父類內容時,子類的成員變量並未顯示初始化。等super()父類初始化完畢后, 22 //才進行子類的成員變量顯示初始化。 23 24 System.out.println("zi cons run...."+num); 25 return; 26 } 27 void show() 28 { 29 System.out.println("zi show..."+num); 30 } 31 } 32 class ExtendsDemo5 33 { 34 public static void main(String[] args) 35 { 36 Zi z = new Zi(); 37 z.show(); 38 } 39 }
運行結果:
zi show...0
zi cons run....8
zi show...8
子父類中同名變量問題(面試)
class Fu { private int num = 4; public int getNum() { return num; } } class Zi extends Fu { private int num = 5; void show() { System.out.println(this.num + "....." + super.getNum()); } } class ExtendsDemo1 { public static void main(String[] args) { Zi z = new Zi(); z.show(); } }
輸出結果:
5.....4