2012-08-09 71 views
1

我的代碼是: -java代碼中如何實例化?

class Building{} 

class Barn extends Building{ 
    public static void main(String[]args){ 
     Building build1 = new Building(); 
     Barn bar1 = new Barn(); 
     Barn bar2 = (Barn)build1; 
     Object obj1 = (Object)build1; 
     String str1 = (String)build1; //also an error over here 
     Building build2 = (Building)bar1; 
    } 
} 

我是新來的Java。所以請任何人都可以向我解釋如何在這裏進行實例化,比如如何訪問每個對象。

此外,代碼中有一個錯誤,請幫助我糾正它。

+0

我希望「穀倉延伸建築」是錯字,它應該是穀倉延伸建築 – kosa 2012-08-09 14:47:11

+1

字符串和建築是沒有辦法相關(無繼承),所以你會得到編譯時錯誤在線字符串str1 =(String)build1 ;.所有其他行編譯,因爲它們是相關的。 – kosa 2012-08-09 14:48:39

+0

學習起來更有趣,它可以與Eclipse一起工作,並且隨着調試器逐步跟隨工作。 – 2012-08-09 15:34:29

回答

1

鑑於這種Barn bar2 = (Barn)build1;

平等後的部分((倉)build1中)意味着你類型轉換build1中式建築類型穀倉並通過它的價值BAR2。

你能做到這一點,因爲任何穀倉一個建築,因爲你在類定義延伸(延伸穀倉大廈)。您還可以將任何類類型轉換爲Object類,因爲在Java中,所有類都從Object繼承,也就是說,一切都是Object。

當您試圖將其轉換爲字符串時發生此錯誤,因爲Building沒有與String類型的連接。得到它了?

+0

但是請告訴我在上面聲明的每個對象中權限是如何變化的......比如哪個對象可以訪問哪些類的所有成員(如果定義的話)...我希望你有我的問題嗎? – 2012-08-09 15:02:16

+0

您只能使用'new'運算符初始化。您在代碼中執行了兩次,其他情況是在投射值類型時賦值。 在瞭解了Java的核心原理之後,應該學習該主題(類型轉換)。您應該首先了解面向對象編程的基礎知識。我可以推薦你閱讀** Head First Java ** - 幾天後你將會有一次大的知識飛躍。 – 2012-08-09 15:06:05

1

您不能投Building作爲String類型。這兩個類之間沒有關係(繼承,接口等)。

這當然是一個BuildingObject的情況下,但你會被它鑄造於Object失去你Building對象的信息。

實例化變量是從右到左的關聯;您創建每個對象的新實例,並將其分配給一個變量。如果你正在進行演員陣容,那麼確保你正在投射的類型與你獲得的類型相關聯是很重要的(例如,將Object作爲Integer--這可能會也可能不行,這取決於你是什麼樣的人回來可以合理地投爲Integer)。

+0

但請告訴我在上面聲明的每個對象中權限是如何變化的...像哪個對象可以訪問哪些類的所有成員(如果定義)...我希望你有我的問題嗎? – 2012-08-09 14:55:51

0
Building b = (Building) (new Barn()); 

將有機會獲得所有建築物的成員和領域,無視加穀倉領域(這就是所謂的向下轉換);

Barn b = (Barn) (new Building()); 

將導致空指針訪問特定穀倉成員或將使他們未初始化的時候......我有點忘了發生在你向上轉換,因爲它幾乎沒有什麼意義投的動物是貓,除非你期待一隻貓;)

沒有特定的方法或調試器,你將無法注意到的差異。我沒有看到代碼中的用例,只是投射。

+0

除了'Barn b =(Barn)(new Building());''會產生一個'ClassCastException',因爲你實際上不能將一個'Building'轉換成一個'Barn'(不是所有的建築物都是穀倉,畢竟, )。 – 2012-08-09 15:26:37