2012-04-18 124 views
6

所以我刚刚在网上发现了这个代码示例,并且我再次重复它,但很困惑。Java - 接口,实例化一个接口?

从我看来,我收集到的(可能是错误的)是它传递给NumberPrinter类中的print方法的一个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); 
      } 

     }); 
    } 

} 
+0

这看起来可能是一个重复的问题。尝试去这里http://stackoverflow.com/questions/4000062/can-we-create-an-object-of-an-interface – astidham2003 2012-04-18 00:44:59

回答

17

这被称为匿名内部类

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

+0

啊,我想我明白了! – mino 2012-04-18 00:30:12

3

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

+0

所以你可以实例化一个接口的匿名内部类? – mino 2012-04-18 00:29:23

+0

是的,这是正确的。 – 2012-04-18 00:34:24

1

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

你的假设是正确的。

+0

所以,对不起,我很困惑,为什么你可以把它传递给一个匿名的内部类?它是打印机类型的对象吗? – mino 2012-04-18 00:34:20

+0

由于这是匿名内部类,所以没有对象可以引用,所以我不认为这里有任何Printer对象。新的Printer()调用将创建该类的新实例,并将其作为语句的结果返回。 – Chris911 2012-04-18 00:43:03