簡體   English   中英

如果我們創建子類的對象,是否會創建父類的對象?

[英]will there be object creation of parent class if we create an object of child class?

我知道每次創建子類對象時都會調用super。 但是,我特別想知道的是它會加載類還是會創建該父類的對象。

提前致謝。

你有一個對象。
在實例化類時,它首先調用父類的構造函數。 對於每個父類,它遵循相同的邏輯:它首先調用父類的構造函數。

假設: A擴展B擴展C

new A()導致B構造函數調用,它自己調用C構造函數。
作為C然后返回B構造函數調用, A構造函數可以繼續並創建實例A

但是,我特別想知道的是它會加載類還是會創建該父類的對象。

與構造函數執行類似,在加載類之前,必須first加載其父類,並為每個父類遞歸加載。

這里對應於A類擴展B擴展C

class C {
    public C(){    
        System.out.println("C constructor");
    }
}

class B extends C{
    public B() {
        System.out.println("B constructor");
    }

}
class A extends B{
    public A() {
        System.out.println("A constructor");
    }
}


public class Test {
    public static void main(String[] args) {
        new A();
    }
}

編譯這些類,然后通過在java命令中指定-verbose標志(默認情況下啟用類日志)來執行在其main()方法中創建A實例的Test類:

java -verbose Test

你應該在輸出標准中看到類似的東西:

[Loaded java.lang.Object from C:\...]
[Loaded java.io.Serializable from C:\...]
... // load all classes required until loaded C, B and A classes
[Loaded C from file:/C:/...]
[Loaded B from file:/C:/...]
[Loaded A from file:/C:/...]
C constructor
B constructor
A constructor

它證實:

  • 需要首先通過根父類( Object )開始加載父類,直到最近的父類( B )。
  • 在加載層次結構的所有類之前,不執行構造函數
  • 父類的構造函數總是在實例化類的構造函數之前執行,方法是從根父構造函數( Object )開始,直到最接近的父構造函數( B )。

調用構造函數,因此創建父類的對象。 稍后使用該對象來構建子類的對象。 這樣做的原因是子類的對象是父類的對象,具有更多的東西。

因為子類從父類繼承屬性和方法,所以加載了整個類層次結構(包括超類和實現的接口)。

當您創建childclass的一個實例,只有類型childclass的一個對象被創建(實例化)。 沒有任何父母的額外實例。

在父類上聲明的屬性和方法可以通過子類實例訪問,並且由於這種繼承,子類實例將被接受為任何期望父實例(或它或任何父實現的任何接口)的方法的參數。

如果您將代碼視為合同設計 ,那么這非常有意義:

  • 父類聲明確定某些方法可用於調用自身或其任何子代。 接口也是如此。
    例如 ,現實世界中的所有雇佣合同都必須包含某些條款,但其余的由公司決定。
  • 通過繼承( extendsimplements ),可以保證子項也將自動提供相同的方法。
    例如 ,我們可以假設任何遵守法律的公司將提供雇佣合同,包括這些條款和(一旦同意)您和公司的簽名。
  • 需要加載整個層次結構才能理解完整的合同。
    例如 ,如果存在爭議,審查合同的律師將通過查看立法機構提供的樣本合同來檢查法律規定的內容。 parentClass是問題中的樣本。
  • 我們只需要一個對象實例。
    例如,你不會得到兩份勞動合同,一份是基本的,另一份是有更多的信息。 您將收到並簽署一份文件。
  • 最后,在我的模擬中,任何雇佣合同(無論如何措辭)都會被任何要求您證明您與雇用您的公司的關系的機構所接受(假設它是合法且有效的,包含法律規定的條款和適當的簽名)。

當您第一次加載一個類時,它的所有祖先也會以遞歸方式加載。

實例化對象時,不會實例化其父對象的其他實例。 但是,您剛剛實例化的對象本身也是父實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM