编辑:忘记代码SNIPPET _在此处添加
我正在尝试从“学习Java”一书中学习Java,其中列出了以下代码片段作为接口回调的示例。在此代码段中,只有一个类实现了TextReceiver接口。我的问题是 - 因为这段代码是直接实例化接口,如果有另一个类实现了接口 TextReceiver 并且提供了一个与TickerTape中的接口方法接收文本完全不同的方法体,那么如何java会解决TextSource的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 ); } }
我试着自己编写这个来解决这个问题,但是因为所有这些类都在同一个类中而被编译问题。我知道这听起来很糟糕 - 但我认为你们可能会提供快速指导。
提前致谢!!!
答案 0 :(得分:2)
通过查看对象实例的实际类型,在运行时调度方法。
所以,如果你有
TextReceiver one = new SomeTextReceiver();
TextReceiver two = new SomeCompletelyDifferentTextReceiver();
然后致电
one.receiveText();
JVM将查看实际对象并查看它是什么类。
调用将被分派到该运行时类提供的实现。
在编译时这里所知的全部是接口,因此编译器会检查接口中是否存在这样的方法,但是在运行时实际班级可以确定并发送给。
请注意,此过程与静态方法不同。那些没有关联的实例,编译器确定要调用哪个实现。因此,您无法真正覆盖静态方法以获取运行时调度。
答案 1 :(得分:0)
Java接口无法实例化,程序员必须指定他想要实例化的接口的实现。
例如,如果您尝试这样做(将INTERFACE替换为接口名称):
INTERFACE i = new INTERFACE();
您将收到错误,因为无法实例化接口。
您必须做的是(将IMPLEMENTATION替换为接口实现的名称):
INTERFACE i = new IMPLEMENTATION();
如您所见,您总是告诉程序用于接口的实现。没有模棱两可的余地。
在您的示例中,类TextSource不是即时接口TextReceiver接口(使用“new”关键字进行实例化)。相反,它有一个构造函数,它接收接口的实现作为参数。因此,当您调用TextSource时,您必须告诉它使用TextReceiver的实现。