2012-04-18 127 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