2017-07-10 53 views
-4

我已經寫下了多態性的例子。爲什麼子類中的新方法不能通過超類參考變量訪問

package tsys; 

public class DynamicPolymorphism { 
    public void eat(){ 
     System.out.println("DynamicPolymorphism"); 
    } 
} 
class AnotherClass extends DynamicPolymorphism{ 
    public void eat(){ 
     System.out.println("Another Class"); 
    } 
    public void consume(){ 
     System.out.println("consume"); 
    } 
} 
class TestPolymorphism{ 
    public static void main(String args[]){ 
     DynamicPolymorphism dp = new AnotherClass(); 
     dp.eat();//Works fine 
     dp.consume();//compile time error 
    } 
} 

現在問題是爲什麼編譯器會抱怨dp.consume()?我在一次採訪中詢問了這個問題,我解釋了原因爲 「在編譯時,編譯器只知道類型爲dp的引用類型爲DynamicPolymorphism因此編譯器無法找到consume方法。」

訪問者對我的答案進行計數,並詢問幕後編譯器給出了錯誤,但我們將變量dp指向AnotherClass的實例。

我還可以解釋面試官對櫃檯問題嗎?

+1

Downvoters,你能解釋一下問題出在哪裏,我可以改進嗎? –

+1

我會要求澄清,因爲我不明白反問題。沒有「幕後」。編譯器知道'dp'是一個'DynamicPolymorphism',所以它只會允許它知道的調用,即調用'DynamicPolymorphism'聲明的方法。基本上你說什麼。這是Java [靜態類型](https://stackoverflow.com/q/1517582/5221149)語言的基本性質。 – Andreas

+0

@Andreas你的回答很貼切,我只是在看這裏,有沒有什麼,我錯過了關於多態性。謝謝 –

回答

-2

dp被聲明爲DynamicPolymorphism。因此對AnotherClass的方法一無所知。如果你想調用消費,那麼你需要強制轉換並調用消費。 嘗試((AnotherClass)dp).cosume()

+0

OP已經意識到這一點。請閱讀整個問題。 –

+0

根據DynamicPolymorphism類的合約,只有吃纔可見。因此,在編譯期間,類型轉換必須用於可視化。 – PrashanthBC

相關問題