2013-05-11 85 views

回答

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
  • 我們已經創建了一個對象具有領域的一個實例(實例superclassFieldsubclassField)。即使這些字段是私人的(即他們通常會這樣做),情況也是如此 - Subclass中的代碼將無法訪問Superclass中聲明的私人字段,但字段仍然存在 - 仍然可以訪問代碼在Superclass之內。

,我們已經得到了與所有狀態的單個對象(包括超類和子類)的事實和所有行爲(內Superclass聲明的任何方法仍然可以對Subclass的情況下使用,儘管有些可能是覆蓋更具特色的行爲)對於理解Java的多態性方法至關重要。

+0

值得注意的是,子類對象具有任何超類聲明的所有字段。這是它能夠作爲任何超類的對象的關鍵。 – 2013-05-11 14:44:58

+0

@PatriciaShanahan:謝謝,將這個添加到示例中。 – 2013-05-11 14:45:18

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

沒有。 它不會創建父類的實例。但肯定會創建一個實例。並將對象引用傳遞給子類。因此,實例在父類中創建並由子類構造函數調用。和兒童班級方法運作。