2014-06-09 187 views
1

編輯在方法解析:忘記代碼片段_這裏補充實例化一個接口

我想從書「學習Java的有列爲接口回調一個例子,下面的代碼片段學習Java。在這段代碼中,只有1個類實現了接口TextReceiver。我的問題是 - 因爲這個代碼直接實例化接口,如果有另一個類實現了接口TextReceiver,並提供了一個完整的接口方法receivetext而不是TickerTape中的方法體,那麼java將如何解析引用到TextText的sendText方法中的方法receivetext?這似乎是這將引入不確定性 - 也似乎印證了什麼,我已經在網上看到有關不能夠實例化的接口 - 但希望之前假設

interface TextReceiver { 
    void receiveText(String text); 
} 

class TickerTape implements TextReceiver { 
    public void receiveText(String text) { 
     System.out.println("TICKER:\n" + text + "\n"); 
    } 
} 

class TextSource { 
    TextReceiver receiver; 

    TextSource(TextReceiver r) { 
     receiver = r; 
    } 

    public void sendText(String s) { 
     receiver.receiveText(s); 
    } 
} 

我嘗試了寫這篇長達確認我自己弄清楚了,但是因爲所有這些類都在同一個類中,所以遇到了編譯問題。我知道這聽起來不錯 - 但我想你們可能會提供快速指導。

在此先感謝!

+2

那麼代碼在哪裏 – Satya

+2

你應該研究多態。你的書肯定有一個關於此的章節。只要繼續閱讀。 –

+0

發佈你試過的代碼 –

回答

0

Java接口不能實例化,程序員必須指定他想要實例化接口的實現。

例如,如果你嘗試這樣做(與接口的名稱替換接口):

INTERFACE i = new INTERFACE(); 

,你會得到一個錯誤,因爲接口不能被實例化。

你必須做什麼(更換接口的實現的名稱實現):

INTERFACE i = new IMPLEMENTATION(); 

正如你所看到的,你總是告訴程序執行什麼要使用的接口。沒有模棱兩可的餘地。

在您的示例中,類TextSource不是即時接口TextReceiver(實例化發生在「新」關鍵字)。相反,它有一個構造函數,它將接口的實現作爲參數接收。因此,當你調用TextSource時,你必須告訴它要使用什麼TextReceiver的實現。

+0

GOT IT!感謝Zenadix!我沒有(足夠的)注意到類沒有實例化接口,並且它需要構造提供接口的特定實現作爲參數 - 這可以解決模糊問題! –

2

通過查看對象實例的實際類型,在運行時調度方法。

所以,如果你有

TextReceiver one = new SomeTextReceiver(); 
TextReceiver two = new SomeCompletelyDifferentTextReceiver(); 

,然後調用

one.receiveText(); 

JVM將看到實際的對象,看看它是什麼類。

該調用將被分派給該運行時類所提供的實現。

編譯時所有在這裏有名的是接口,所以編譯器會檢查,這種方法在接口的存在,但在運行時實際的類可以被確定,並分發給。

請注意,對於靜態方法,此過程是不同的。那些沒有關聯的實例,編譯器確定要調用哪個實現。因此,您無法真正重寫靜態方法來獲取運行時分派。

+0

+1。在這些場景中,我總是發現它值得一提,這就是'getClass()'完全可以工作的原因。通常最終對新程序員來說非常直觀。 – asteri

相關問題