web-dev-qa-db-ja.com

インターフェイスのオブジェクトを作成できますか?

interface TestA {
    String toString();
}

public class Test {
    public static void main(String[] args) {
        System.out.println(new TestA() {
            public String toString() {
                return "test";
            }
        });
    }
}

結果は何ですか?

テスト
B。ヌル
C。実行時に例外がスローされます。
D。 1行目のエラーのため、コンパイルは失敗します。
E。 4行目のエラーのため、コンパイルは失敗します。
F。 5行目のエラーのため、コンパイルは失敗します。

この質問の答えは何ですか、なぜですか?この質問に関してもう1つ質問があります。 4行目では、Aのオブジェクトを作成しています。インターフェイスのオブジェクトを作成することは可能ですか?

31
shirsendu shome

ここで見ているのは 匿名の内部クラス です:

次のインターフェースがある場合:

interface Inter {
    public String getString();
}

次のようなインスタンスを作成できます。

Inter instance = new Inter() {
    @Override
    public String getString() { 
      return "HI"; 
    } 
  };

これで、定義したインターフェイスのインスタンスが作成されました。ただし、実際に行ったことは、インターフェイスを実装するクラスを定義し、同時にクラスをインスタンス化することに注意してください。

87
jjnguy

testが出力になります。これは、匿名の内部クラスの例です。

これは、クロージャーのエミュレーションとしてComparatorインターフェースで使用される非常に一般的なパターンです。

5
Stefan Kendall

これも試してください...匿名クラスの名前が生成されます!

Inter instance = new Inter() {
    public String getString(){ return "HI"+this.getClass(); }
};
1
Kshitij

トリックは匿名内部クラスに関するものではありません。これはテストを出力してtoStringメソッドをオーバーライドし、System.out.printlnがObjectを暗黙的に呼び出してtoStringメソッドを呼び出します。

1