Java是面向對象的一種語言,在Java對象生成的過程,涉及子類和父類的加載、靜態成員變量的初始化、子類和父類對象的初始化等過程,其具體過程通過下述代碼來說明。
- class A
- {
- public A(String s)
- {
- System.out.println(s+" Constructor A");
- }
- }
- class B
- {
- public B(String s)
- {
- System.out.println(s+ " Constructor B");
- }
- }
- class C
- {
- public C(String s)
- {
- System.out.println(s+ " Constructor C");
- }
- }
- class Base
- {
- static A a1 = new A("a1: static");
- A a2 = new A("a2: normal");
- public Base()
- {
- A a3 = new A("a3: normal");
- System.out.println("Constructor Base");
- }
- }
- class Derived extends Base
- {
- static B b1 = new B("b1: static");
- B b2 = new B("b2: normal");
- public Derived()
- {
- B b3 = new B("b3: normal");
- System.out.println("Constructor Derived");
- }
- }
- public class Test {
- static C c1 = new C("c1: static");
- C c2 = new C("c2: normal");
- public static void main(String[] args) {
- C c3 = new C("c3: normal");
- Derived derived = new Derived();
- System.out.println("end");
- }
- }
該段代碼的執行結果爲:
c1: static Constructor C
c3: normal Constructor C
a1: static Constructor A
b1: static Constructor B
a2: normal Constructor A
a3: normal Constructor A
Constructor Base
b2: normal Constructor B
b3: normal Constructor B
Constructor Derived
end
對上述執行結果進行分析,其生成過程爲:
1)程序執行時,首先加載main函數所在的類Test,由於Test類包含靜態成員變量c1,因此對該變量進行初始化,調用其構造函數。
2)由於c2是Test類的對象成員變量,且此處並沒有初始化Test類對象,因此不需要初始化c2。
3)執行main函數。
4) main函數聲明且初始化變量c3,因此調用其構造函數。
5)main函數聲明且初始化變量derived,此過程可具體劃分爲以下步驟:
a) 加載Derived類,由於其繼承自Base類,因此還需加載Base類。
b) 類加載完成後,由父類至子類,先後完成其中靜態成員變量的初始化,因此先後調用a1,b1的構造函數。
c) 靜態成員變量初始化後,由父類至子類,先後完成類對象的初始化。在類對象的初始化過程中,首先初始化對象成員變量,再調用構造函數。因此,在Base類,首先調用a2的構造函數,再調用Base的構造函數,在構造函數中,調用a3的構造函數;而在Derived類,首先調用b2的構造函數,再調用Derived的構造函數,在構造函數中,調用b3的構造函數。
6) 綜上,完成了整個對象的初始化生成過程和程序運行。
❤提問/互動請留言,可直接在最底右下方"寫留言即可"
❤Java初高級一起學習分享,共同學習纔是最明智的選擇,喜歡的話可以我的學習羣64弍46衣3凌9,或加資料羣69似64陸0吧3(進羣備註平臺名)
❤如果覺得寫得不錯請點擊“訂閱”,每天更新全新的內容!
❤你們的喜歡和關注就是我最大的動力支撐!!!