簡體   English   中英

實例化接口時的方法解析

[英]method resolution when instantiating an interface

編輯:放棄代碼片段_在此添加

我正在嘗試從“學習Java”這本書中學習Java,該書列出了以下代碼片段作為接口回調的示例。 在此代碼段中,只有1個類實現了TextReceiver接口。 我的問題是-由於此代碼直接實例化了接口,如果存在另一個實現接口TextReceiver的類,並且為接口方法receivetext提供了與TickerTape中的方法完全不同的方法主體,那么java將如何解析對該方法的引用。方法在TextSource的sendText方法中接收文本? 這似乎會引起歧義-同樣,這似乎使我在線上看到的關於無法實例化接口的信息可信-但想在假設之前進行確認

 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 ); } } 

我試圖自己寫這個來解決這個問題,但是由於所有這些類都在同一個類中,因此在編譯問題上陷入了困境。 我知道這聽起來很不錯-但我認為你們可能會提供快速的指導。

提前致謝!!!

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

所以如果你有

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

然后打電話

 one.receiveText();

JVM將查看實際的對象,並查看其所屬的類。

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

編譯時 ,這里只知道接口,因此編譯器將檢查接口中是否存在這樣的方法,但是在運行時 ,可以確定實際的類並將其分派給該方法。

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

Java接口無法實例化,程序員必須指定要實例化的接口實現。

例如,如果您嘗試執行此操作(將INTERFACE替換為接口名稱):

INTERFACE i = new INTERFACE();

您將得到一個錯誤,因為無法實例化接口。

您必須要做的是(將IMPLEMENTATION替換為接口實現的名稱):

INTERFACE i = new IMPLEMENTATION();

如您所見,您總是告訴程序接口要使用什么實現。 沒有歧義的余地。

在您的示例中,類TextSource沒有實例化接口TextReceiver(實例化是通過“ new”關鍵字進行的)。 相反,它具有一個構造函數,該構造函數將接口的實現作為參數接收。 因此,當您調用TextSource時,必須告訴它要使用哪種TextReceiver實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM