2014-11-25 128 views
5

我想分配一個子類對象數組到它的超類。該程序編譯成功,但我得到一個ArrayStoreException。我知道數組父和子都是對同一個數組的引用,但是我不應該至少可以訪問方法funcJava:超類數組對象分配有子類數組對象

class Pclass 
{ 
    Pclass() 
    { 
     System.out.println("constructor : Parent class"); 
    } 

    public void func() 
    { 
     System.out.println("Parent class"); 
    } 
} 

class Cclass extends Pclass 
{ 
    Cclass() 
    { 
     System.out.println("Constructor : Child class"); 
    } 

    public void func2() 
    { 
     System.out.println("It worked"); 
    } 

    public void func() 
    { 
     System.out.println("Common"); 
    } 
} 

public class test 
{  
    public static void main(String ab[]) 
    {  
     Cclass[] child = new Cclass[10]; 
     Pclass[] parent = child; 
     parent[0]=new Pclass(); 
     parent[0].func(); 
    } 
} 
+0

作爲適當的java代碼,您對可見度非常挑剔。對於統一的代碼,你想在那裏有一些「公共」(並且你想要修復那個空白遍佈的地方......記得通讀http://stackoverflow.com/help/how-to-ask--「記得校對「部分不在那裏只是爲了好玩,很多人,你包括在內,忘了) – 2014-11-25 06:24:18

回答

4

你不能做到這一點:

Cclass[] child = new Cclass[10]; 
Pclass[] parent = child; 
parent[0]=new Pclass(); 

你應該嘗試這樣做:

Cclass[] child = new Cclass[10]; 
Pclass[] parent = child; 
parent[0]=new Cclass(); 

這是因爲,首先分配Pclass陣列孩子參考,只能有Cclass對象,那麼你試圖將Pclass對象分配給父引用,這是不允許的!

見,什麼情況是,你已經創建堆上的一個Cclass對象時,你寫新Cclass,雖然Cclass對象是數組中的空,但現在他們只接受Cclass對象或它的子類的對象

所以分配Pclass對象將是非法的!

原因得到一個運行時異常,而不是編譯時間:

編譯器只檢查類是否在同一個繼承層次與否,因爲它們是在同一個層次,你得到一個運行時異常。

+0

OP知道他不能那樣做 - 問題是*爲什麼不是這樣?你的替代建議與這個問題無關。-1 – drewmoore 2014-11-25 06:30:05

+0

@drewmoore它需要時間來寫完整的答案:) – 2014-11-25 06:30:47

+0

downvote廢除,但你還沒有真正回答這個問題。底層的混淆是引用vs值問題 – drewmoore 2014-11-25 06:32:46

0

雖然參考陣列是Pclass,你正在引用它們陣列目的是Cclass型的(你實例化的對象new Cclass[]。不能由具有不同類型的引用它的變量改變對象的類型)。您不能將Pclass對象存儲在Cclass陣列中。

相反,如果可能的話,你應該使用創建對象的子類型:

parent[0] = new Subclass(); 
1

如果你讀的ArrayStoreException規範,你會發現它被拋出to indicate that an attempt has been made to store the wrong type of object into an array of objects.

您創建的實例Cclass數組,因此只有Cclass(或其子類)的實例可以存儲在此數組中。您將該實例的引用存儲在類型爲Pclass[]的變量中的事實不會改變該事實。

0

你實際實例化的線子類對象:Cclass[] child = new Cclass[10];,當您使用實例化一個new Pclass();父對象你物體而將其分配到子對象的refernce出現向下轉換在運行時創建父和它失敗,因爲你正嘗試將父對象存儲到子引用中。因此它會拋出ArrayStoreException即您試圖將錯誤類型的對象存儲到對象數組中。