如果我創建了子類的對象,那麼是否還會創建子類繼承的超類對象?如果不是,那麼如何通過創建Thread類的子類(在多線程中)調用Thread類的構造函數並創建一個Thread對象?創建子類的實例是否會自動創建其超類對象?
9
A
回答
2
只有當您創建另一個對象的子類時才創建一個對象。它是子類及其所有父母的一個實例。例如,我創建一個貓對象。它是一隻貓,同時又是一隻貓科動物,哺乳動物,動物和一個物體。
10
子類的一個實例是超類的一個實例。只有一個對象被創建,但作爲創建的一部分,構造函數調用被鏈接在一起,一直到java.lang.Object
。因此,例如:
public class Superclass {
// Note: I wouldn't normally use public variables.
// It's just for the sake of the example.
public int superclassField = 10;
public Superclass() {
System.out.println("Superclass constructor");
}
}
public class Subclass extends Superclass {
public int subclassField = 20;
public Subclass() {
super(); // Implicit if you leave it out. Chains to superclass constructor
System.out.println("Subclass constructor");
}
}
...
Subclass x = new Subclass();
System.out.println(x instanceof Subclass);
System.out.println(x instanceof Superclass);
System.out.println(x.superclassField);
System.out.println(x.subclassField);
的這個輸出是:
Superclass constructor
Subclass constructor
true
true
10
20
...因爲:
- 任何構造函數做的第一件事就是打電話或者在同一個類的另一個構造函數,或超類的構造函數。所以我們在輸出中的「Subclass constructor」之前看到「Superclass constructor」。
- 我們已經創建的對象是(顯然)的
Subclass
- 我們已經創建的對象是也的
Superclass
- 我們已經創建了一個對象具有都領域的一個實例(實例
superclassField
和subclassField
)。即使這些字段是私人的(即他們通常會這樣做),情況也是如此 -Subclass
中的代碼將無法訪問在Superclass
中聲明的私人字段,但字段仍然存在 - 仍然可以訪問代碼在Superclass
之內。
,我們已經得到了與所有狀態的單個對象(包括超類和子類)的事實和所有行爲(內Superclass
聲明的任何方法仍然可以對Subclass
的情況下使用,儘管有些可能是覆蓋更具特色的行爲)對於理解Java的多態性方法至關重要。
1
當你創建一個對象時,它會得到一塊包含一組變量的內存來保存它所有的數據。
子類將包含子項的字段和來自其祖先的任何字段。所以這是一個單獨的對象,就像孩子及其祖先一樣。在創建子類時沒有創建父類對象。
-1
在這裏,我用一個例子
如果創建一個子類對象時,它自動創建超類對象的縮寫?
class P{
P(){
System.out.println(this.hashCode()); // it will print 2430287
}
}
class C extends P{
C(){
System.out.println(this.hashCode()); // it will also print 2430287
}
}
public class Test{
public static void main(String... args){
C obj = new C();
System.out.println(c.hashCode()); //Again, it will print 2430287
}
}
如果您編譯並運行此代碼,您會發現相同的對象hashCode
正在打印。所以,這意味着只有一個對象被創建。
現在,父類對象如何被初始化?
在此示例中,只創建一個對象,它是子類的一個實例,但有兩個構造函數(父項和子項)正在執行。但構造函數只是在子類的上下文中。
0
沒有。 它不會創建父類的實例。但肯定會創建一個實例。並將對象引用傳遞給子類。因此,實例在父類中創建並由子類構造函數調用。和兒童班級方法運作。
相關問題
- 1. 創建子類對象是否也創建其超類的對象?
- 2. 在創建子類實例時是否還創建了超類實例?
- 3. 如何從超類的實例創建子類的實例?
- 4. 創建實例化其他成員類的主類的對象
- 5. 從外部類創建子類的對象實例
- 6. 是否可以從父類創建子類的實例?
- 7. 動態創建類實例
- 8. 在java中創建超類的類型的子類對象
- 9. 知道何時通過創建子類創建類的實例?
- 10. 創建子類(特定)或超類(通用)類型的對象?
- 11. jvm從動態抽象類創建類對象是否昂貴?
- 12. 創建派生類的對象時創建超類的對象嗎?
- 13. 如何從其基類的實例創建一個新對象?
- 14. 是否在Python中創建類「對象」
- 15. 當實例化一個Java對象時,它是否是自動創建的父類的對象?
- 16. 自動選擇和創建類對象
- 17. 用於創建子類對象實例的設計模式
- 18. 創建後更改實例化對象的子類
- 19. 當創建子類對象時,是爲超類創建的第二個對象嗎?
- 20. 的Python - 創建自我複製類對象實例
- 21. 在Java中,我可以創建「基於」超類實例的子類實例嗎?
- 22. 無法創建抽象類的實例
- 23. Eclipse是否創建自動類?
- 24. 創建接口子類的實例
- 25. ASP.NET無法啓動創建的類的實例對象
- 26. 如何從動態創建的類獲取對象的實例
- 27. 創建類的實例
- 28. 創建類的實例
- 29. 創建類的實例
- 30. 創建類的實例
值得注意的是,子類對象具有任何超類聲明的所有字段。這是它能夠作爲任何超類的對象的關鍵。 – 2013-05-11 14:44:58
@PatriciaShanahan:謝謝,將這個添加到示例中。 – 2013-05-11 14:45:18