2012-04-18 15 views
6

ちょっと前にこのコード例をオンラインで見つけましたが、もう一度やり直していますが、かなり混乱しています。Java - インターフェース、インターフェースをインスタンス化しますか?

これを見ると、何が集まっているのか(それは間違っているかもしれません)、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); 
      } 

     }); 
    } 

} 
+0

これは重複した質問のようです。ここに行くhttp://stackoverflow.com/questions/4000062/can-we-create-an-object-of-an-interface – astidham2003

答えて

17

これは匿名内部クラスと呼ばれています。

Printerインターフェイスを実装する名前のないクラスを作成します。

+0

ああ、私はそれを得ると思います! – mino

3

あなたの仮定は正しいので、インターフェイスをインスタンス化することはできません。ただし、コードが実行している匿名クラスをインスタンス化することはできます。

+0

インターフェイスの匿名の内部クラスをインスタンス化できますか? – mino

+0

はい、それは正しいです。 –

1

NumberPrinterの印刷機能には、Printerオブジェクトが必要です。その関数を呼び出すと、実際にはPrinterインターフェイスをインスタンス化することはありませんが、その実装をインスタンス化するため、これが機能しています。

あなたの前提は間違いです。

+0

申し訳ありませんが、私はなぜそれを匿名の内部クラスに渡すことができます混乱しているのですか?それはPrinterタイプのオブジェクトですか? – mino

+0

これは匿名の内部クラスなので参照するオブジェクトはありませんので、ここにはPrinterオブジェクトはないと思います。新しいPrinter()コールは、そのクラスの新しいインスタンスを作成し、それをステートメントの結果として返します。 – Chris911

関連する問題