【问题标题】:Java - Interface, instantiating an interface?Java - 接口,实例化接口?
【发布时间】:2012-04-18 00:23:10
【问题描述】:

所以不久前我刚刚在网上找到了这个代码示例,我正在重新审视它,但很困惑。

通过查看,我收集到的(可能是错误的)是它传递给 NumberPrinter 类中的 print 方法一个 Printer 对象。不过这个接口也叫Printer,那我们不就是实例化一个Printer接口的匿名类,定义方法然后传递吗?

我的基本问题是,我最初的假设是否正确?如果是这样,我认为您无法实例化接口?

public class NumberPrinter {

    public interface Printer {
        public void print (int idx);
    }

    public static void print (Printer p) {
        for (int i = 0; i < 4; i++) {
            p.print(i);
        }
    }

    public static void main(String[] args) {
        print(new Printer() {

            @Override
            public void print(int idx) {
                System.out.println(idx);
            }

        });
    }

}

【问题讨论】:

标签: java interface instantiation anonymous-inner-class


【解决方案1】:

这称为匿名内部类

它创建了一个实现Printer 接口的未命名类。

【讨论】:

    【解决方案2】:

    你的假设是正确的,你不能实例化一个接口。但是,您可以实例化一个匿名类,这就是代码正在做的事情。

    【讨论】:

    • 那么你可以实例化一个接口的匿名内部类吗?
    【解决方案3】:

    NumberPrinter 的打印功能需要一个 Printer 对象。当您调用该函数时,您实际上并没有实例化 Printer 接口,而是实例化了它的实现,这就是它起作用的原因。

    顺便说一句,你的假设是正确的。

    【讨论】:

    • 所以,对不起,我很困惑为什么你可以给它传递一个匿名的内部类?它是打印机类型的对象吗?
    • 由于这是匿名内部类,因此没有可引用的对象,因此我认为这里没有任何 Printer 对象。 new Printer() 调用创建该类的新实例并将其作为语句的结果返回。
    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多