誰かがこのJava構文を私に説明できますか?外側の括弧の内側でそれらのブラケットは何をしていますか?
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
誰かがこのJava構文を私に説明できますか?外側の括弧の内側でそれらのブラケットは何をしていますか?
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
これは匿名内部クラスと呼ばれます。これは、拡張する名前のないクラスを作成しWindowAdapter
(インターフェースを指定することも可能であり、その場合、クラスはそのインターフェースを実装します)、そのクラスの1つのインスタンスを作成します。括弧内には、すべての抽象メソッドまたはすべてのインターフェースメソッドを実装する必要があり、メソッドをオーバーライドすることもできます。
そして、andersojの答えを補完するために、通常、メソッドがXのインスタンスを期待するときにそれらを使用しますが、Xは抽象クラスまたはインターフェースです。
ここでは、実際にWindowAdapterから派生クラスを作成し、特定のタスクを実行するためにメソッドの1つをオーバーライドしています。
この構文は、イベントハンドラー/リスナーで非常に一般的です。
匿名の内部クラスです。これは単なるショートカットです。トップレベルのクラスとしてコードを作成する必要がある場合、コードがどのように見えるかを想像できます。
class CloseApplicationWindowAdapter extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
次に、コード内で次のことを行います。
CloseApplicationWindowAdapter adapter = new CloseApplicationWindowAdapter();
addWindowListener(adapter);
どちらのソリューションもまったく同じ効果があります(たとえば、匿名クラスはClass$1.class
ファイルを作成します)。匿名クラスが大きくなりすぎたり、複雑になったり、重要になったりしない場合、Javaプログラマーは匿名クラスのアプローチを好むことがよくあります。