2014-06-09 143 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

相关问题