爲何Java實例化子類時會遞歸調用父類構造方法

下面的代碼輸出結果會是什麼?bash

public class A {
    double a;
    double b;
    A(){
        a = -1;
        b = -1;
    }
}

class B extends A{
    private double c;

    B(){
        c = -1;
    }
}

class Demo{
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        System.out.println(b.a);
    }
}
複製代碼

答案是 -1.0。學習

緣由在於當實例化子類時會遞歸調用父類中的構造方法。而這又是爲何呢?spa

首先,這涉及到Java對象的生命週期。在Java中,對象的生命週期包括如下幾個階段:線程

建立階段(Created)
應用階段(In Use)
不可見階段(Invisible)
不可達階段(Unreachable)
收集階段(Collected)
終結階段(Finalized)
對象空間重分配階段(De-allocated)code

1. 建立階段(Created)

在建立階段系統經過下面的幾個步驟來完成對象的建立過程:對象

爲對象分配存儲空間
開始構造對象
從超類到子類對static成員進行初始化
超類成員變量按順序初始化,遞歸調用超類的構造方法
子類成員變量按順序初始化,調用子類構造方法。
一旦對象被建立,並被分派給某些變量賦值,這個對象的狀態就切換到了應用階段。遞歸

2. 應用階段(In Use)

對象至少被一個強引用持有着。生命週期

3. 不可見階段(Invisible)

當一個對象處於不可見階段時,說明程序自己再也不持有該對象的任何強引用,雖然該這些引用仍然是存在着的。進程

簡單說就是 程序的執行已經超出了該對象的做用域 了。內存

4. 不可達階段(Unreachable)

對象處於不可達階段是指該對象再也不被任何強引用所持有。

與「不可達階段」相比,「不可見階段」是指程序再也不持有該對象的任何強引用,這種狀況下,該對象仍可能被JVM等系統下的某些已裝載的靜態變量或線程或JNI等強引用持有着,這些特殊的強引用被稱爲」GC root」。存在着這些GC root會致使對象的內存泄露狀況,沒法被回收。

5. 收集階段(Collected)

當垃圾回收器發現該對象已經處於「不可達階段」而且垃圾回收器已經對該對象的內存空間從新分配作好準備時,則對象進入了「收集階段」。若是該對象已經重寫了finalize()方法,則會去執行該方法的終端操做。

沒有特殊緣由的話不要重載finazlie()方法,緣由有兩點:

會影響JVM的對象分配與回收速度:
在分配該對象時,JVM須要在垃圾回收器上註冊該對象,以便在回收時可以執行該重載方法;在該方法的執行時須要消耗CPU時間且在執行完該方法後纔會從新執行回收操做,即至少須要垃圾回收器對該對象執行兩次GC。
可能形成該對象的再次「復活」:
在finalize()方法中,若是有其它的強引用再次持有該對象,則會致使對象的狀態由「收集階段」又從新變爲「應用階段」。這個已經破壞了Java對象的生命週期進程,且「復活」的對象不利用後續的代碼管理。

6. 終結階段

當對象執行完finalize()方法後仍然處於不可達狀態時,則該對象進入終結階段。在該階段是等待垃圾回收器對該對象空間進行回收。

7.對象空間從新分配階段

垃圾回收器對該對象的所佔用的內存空間進行回收或者再分配了,則該對象完全消失了,稱之爲「對象空間從新分配階段」。

關於垃圾回收機制可見Java 垃圾回收機制

所以當實例化子類時會默認隱式遞歸調用父類中的構造方法。文章最開始的代碼至關於:

public class A {
    double a;
    double b;
    A(){
        a = -1;
        b = -1;
    }
}

class B extends A{
    private double c;

    B(){
        super();
        c = -1;
    }
}

class Demo{
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        System.out.println(b.a);
    }
複製代碼

歡迎加入學習交流羣569772982,你們一塊兒學習交流。

相關文章
相關標籤/搜索