繁体   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