6

このコード例をオンラインで少し前に見つけたので、もう一度調べてみますが、かなり混乱しています。

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

        });
    }

}
4

3 に答える 3

17

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

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

于 2012-04-18T00:26:41.120 に答える
3

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

于 2012-04-18T00:27:51.040 に答える
1

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

ちなみに、あなたの仮定は正しかった。

于 2012-04-18T00:31:29.210 に答える