質問: ### 前提・実現したいこと 以下の2つのプログラムの違いはなんでしょうか? 1つ目のプログラムはウィンドウ右上の×ボタンを押したときにウィンドウを閉じる操作をすることはわかりましたが、2つ目のプログラムがどういうものなのかがわかりません。 1つ目と同じwindowClosing()があって、それ以外にも機能を追加したといことでしょうか? ### 1つ目のソースコード ``` import java.awt.event.*; class MyWindowAdapter extends WindowAdapter{ public void windowClosing(WindowEvent e){ System.exit(0); } } ``` ### 2つ目のソースコード ``` import java.awt.event.*; public class MyWindowListener implements WindowListener { public void windowClosing(WindowEvent e) { System.exit(0); } public void windowOpened(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} } ```
回答: 1つ目は「WindowAdapter」を「継承」したクラスのコードで、2つ目は「WindowListener」を「実装」したクラスになります。 WindowAdapterのリファレンスを確認するとわかりますが、WindowAdapterはWindowListenerを実装しています。WindowAdapterは、2つ目のコードのように、「特になにもしないのにオーバーライドして空のメソッドを実装しなければならない」ことを回避するために、あらかじめ「全部空っぽで実装してあるクラス」なのです。 > > 1つ目と同じwindowClosing()があって、それ以外にも機能を追加したといことでしょうか? > > > つまりこれは逆なのです。機能が増えたのではなく、コードが汚くならないようにするために、不要な機能を先につぶしておいたのがWindowAdapterです。これなら「必要なメソッド」だけオーバーライドすれば済む話ですからね。 じゃあWindowListenerなんていらなくて、最初から全部WindowAdapterで作ればいいじゃないか、という考えに至るかもしれませんが、WindowListenerは「インタフェース」であり、WindowAdapterは「クラス」であることが重要なポイントです。 Javaの制約上、多重にクラスを継承することはできません。しかし、インタフェースはいくらでも同時に実装ができます。なのでWindowAdapterだけでは困る場面もあります。