Java繼承--子類的實例化過程


一個對象的實例化過程:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM