2011-11-12 45 views
0

基本上我在這裏有一個小問題。對象引用類型(動態綁定)的問題?

我有一個超類和一個子類。我應該執行一個任務,從子類中執行一個方法,該方法將覆蓋超類中的方法。這工作正常。我遇到的問題是「動態綁定」。當我將引用變量類型聲明爲與子類相同的類時,它工作正常。但是,當我將類型聲明爲超類時,它不會識別任何子類的方法甚至存在。

下面是一個例子。我有一個名爲船舶類和船舶的另一個子類,稱爲BabyShip

如果我宣佈爲ShippyShip的參考:

BabyShip subref = new BabyShip(); 

它工作正常。然而,當我把它聲明爲:

Ship subref = new BabyShip(); 

編譯器甚至不承認任何從BabyShip的方法,如果我宣佈子參考的類型爲船舶......但我的書中明確表示,它應該。它爲什麼這樣做?

當我編譯它時,它會給出一個正常的找不到符號錯誤。

ShipTester.java:8: error: cannot find symbol 
      ship.setMaxPassengers(1); 
       ^
    symbol: method setMaxPassengers(int) 
    location: variable ship of type Ship 
1 error 

回答

2

你確定你沒有誤讀這本書嗎? Java 不會這樣做動態綁定。如果setMaxPassengers只有BabyShip中聲明,那麼編譯器做的是正確的事情。您只能訪問已知的表達式的編譯時類型的成員 - 在這種情況下,ship的類型爲Ship,因此只有Ship(及其超類)的成員可用。

很難確切地知道問題出在哪裏,而不知道書中的內容。在普通Java中發生的唯一一種動態綁定是爲了覆蓋 - 如果你在Ship中聲明setMaxPassengers,然後在BabyShip中聲明覆蓋,那麼將在執行時調用重寫的方法。

Java 7在動態綁定方面有一些新功能,但它聽起來不像你在這裏談論的那樣。

如果您可以引用您認爲應該起作用的書的某一部分,請這樣做。

+0

對不起。你是對的,我沒有清楚地看到它只能執行類型爲類的方法。我想我需要使用另一種解決方法。 – Johnny

+2

@Johnny:如果你的代碼只能用於特定的子類,那麼它也應該是你的變量的類型。 –