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のオブジェクトを作成しています。インターフェイスのオブジェクトを作成することは可能ですか?
ここで見ているのは 匿名の内部クラス です:
次のインターフェースがある場合:
interface Inter {
public String getString();
}
次のようなインスタンスを作成できます。
Inter instance = new Inter() {
@Override
public String getString() {
return "HI";
}
};
これで、定義したインターフェイスのインスタンスが作成されました。ただし、実際に行ったことは、インターフェイスを実装するクラスを定義し、同時にクラスをインスタンス化することに注意してください。
test
が出力になります。これは、匿名の内部クラスの例です。
これは、クロージャーのエミュレーションとしてComparator
インターフェースで使用される非常に一般的なパターンです。
これも試してください...匿名クラスの名前が生成されます!
Inter instance = new Inter() {
public String getString(){ return "HI"+this.getClass(); }
};
トリックは匿名内部クラスに関するものではありません。これはテストを出力してtoStringメソッドをオーバーライドし、System.out.printlnがObjectを暗黙的に呼び出してtoStringメソッドを呼び出します。