实例化接口时的方法解析

时间:2014-06-09 03:05:38

标签: java

编辑:忘记代码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 );
    }
}

我试着自己编写这个来解决这个问题,但是因为所有这些类都在同一个类中而被编译问题。我知道这听起来很糟糕 - 但我认为你们可能会提供快速指导。

提前致谢!!!

2 个答案:

答案 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的实现。