[英]how can super refer to parent class object when we create a child class object?
[英]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的一個對象被創建(實例化)。 沒有任何父母的額外實例。
在父類上聲明的屬性和方法可以通過子類實例訪問,並且由於這種繼承,子類實例將被接受為任何期望父實例(或它或任何父實現的任何接口)的方法的參數。
如果您將代碼視為合同設計 ,那么這非常有意義:
extends
或implements
),可以保證子項也將自動提供相同的方法。 當您第一次加載一個類時,它的所有祖先也會以遞歸方式加載。
實例化對象時,不會實例化其父對象的其他實例。 但是,您剛剛實例化的對象本身也是父實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.