インターフェースを継承する際は、extendsではなく「implements」を使います。implementsは、実装という意味です。
以下、インターフェースを継承して実装した例です。
package sample;
public interface Interface1 {
public final int N = 1;
abstract public int getN1();
}
package sample; public class SubClass implements Interface1 { @Override public int getN() { return N; } }
インターフェースは複数実装することが可能です。また、インターフェースを実装するクラスには、スーパークラスを別に設けることもできます。
package sample;
public interface Interface1 {
public final int N = 1;
abstract public int getN1();
}
package sample;
public interface Interface2 {
abstract public int getN2();
}
package sample;
public class SuperClass {
}
package sample; public class SubClass extends SuperClass implements Interface1, Interface2 { @Override public int getN1() { return N; } @Override public int getN2() { return N * 2; } }
インターフェースの仕組みを利用しているものに「リスナー」と呼ばれるものがあります。
このリスナーは、GUIの部品でよく使われます。GUIの部品には、リスナーを登録するメソッドが用意されています。リスナーを登録しておくと、GUIの部品で何かイベントが起きた時に、登録しておいたリスナーのメソッドが実行されます。
このリスナーはインターフェースとして用意されています。実際に使う際は、このインターフェースを実装してから利用します。
また、リスナーはインターフェースですので、様々なクラスに、追加の処理として実装できます。
以下、リスナーを使った処理の例です。
package sample; import java.awt.event.WindowEvent; import java.awt.event.WindowStateListener; import javax.swing.JFrame; public class Sample extends JFrame implements WindowStateListener { private static final long serialVersionUID = 1L; public Sample() { // ウィンドウの閉じ方、位置とサイズ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 640, 480); // ウィンドウ状態リスナーとして自身を設定 this.addWindowStateListener(this); } public static void main(String[] args) { Sample smpl = new Sample(); smpl.setVisible(true); // 表示 } // ウィンドウの状態が変更した時の処理 @Override public void windowStateChanged(WindowEvent e) { System.out.println(e); } }