2014-01-25 30 views
0

所以說我有3類,測試儀,水果(父)和蘋果(子類)嘗試使用子類的方法,但它是不是讓我

我已經寫在蘋果的新方法(它擴展果) 。該方法的:

public String getAppleColor() 

現在,在測試說我已經創建了10水果

Fruit fruitArray = new Fruit[10] 

的陣列,說我讓他們中的一個

fruitArray[3] = new Apple() 

這是很好的,因爲蘋果也是類型的水果。不過,我希望到陣列的這一特定元素上使用我的getAppleColor():

String appleColor = fruitArray[3].getAppleColor(); 

爲什麼這是不工作?當我在eclipse中查看fruitArray [3]中的可用方法時,我的Apple方法都沒有顯示,但是我將fruitArray [3]設置爲Apple?

+0

這是因爲Java是一種靜態類型的語言。您可能習慣於像大多數腳本語言一樣動態輸入語言。您只能調用編譯時已知的方法來成爲類型的一部分。您可以使用強制轉換表達式來覆蓋變量的靜態類型。 (對於你的問題*解決方案*,請參閱下面的答案)有關更多信息:http://stackoverflow.com/questions/125367/dynamic-type-languages-versus-static-type-languages –

+0

如果您已經知道'fruitArray [3]'是一個蘋果,你不知道顏色嗎?換句話說,爲什麼假定'fruitArray [3]'是一個蘋果是有意義的,但用''Red'替換對'fruitArray [3] .getAppleColor()'的調用是沒有意義的,或者'「綠色」'或什麼的? – DaoWen

回答

2

不能在Fruit引用調用getAppleColor(),它不聲明方法

更好的設計是有getFruitColor()定義,使Fruit抽象類/使其界面,迫使各Fruit實現此方法

編譯器不知道它將在運行時分配什麼實現

+0

謝謝。只是爲了確認,如果我創建一個對象(在這種情況下爲Fruit對象)並且想要使用子類方法,那麼我必須在超類中實現該方法(Fruit)? – user3029760

+0

沒有聲明是好的,請參考java中的多態性 –

1

編譯器無法知道在運行時聲明爲Fruit的元素實際上是一個Apple。因此,它不會讓您致電Apple中聲明的任何方法。

你的陣列是

Fruit[] fruitArray; 

編譯器可以只知道數組中的元素是Fruit情況下,僅此而已。

2

因爲編譯器不知道fruitArray[3]將包含Apple(它可能包含任何其他種類的Fruit),所以您必須將其轉換爲Apple。嘗試:

String appleColor = ((Apple)fruitArray[3]).getAppleColor(); 
1

你最好聲明的方法getColor()Fruit類,重寫它的子類Apple,那麼你可以通過fruitArray[3].getColor()得到蘋果的顏色。

+0

我只是混淆了「覆蓋」和「覆蓋」的基本概念。感謝道文。 – mojiayi

相關問題