【Java】インターフェースのデフォルトメソッドはオーバーライドできる?基本と実例を解説
Javaのインターフェースとは
Javaにおけるインターフェース(interface)は、クラスによく似た参照型ですが、原則として抽象メソッドと、staticかつfinalな定数フィールドのみを持つことができます。
Java 8以降では、インターフェース内に「デフォルトメソッド」と「静的メソッド」を定義できるようになりました。このうちデフォルトメソッドには、あらかじめ既定の実装(メソッド本体)を持たせることが可能です。したがって、インターフェースを実装するクラス側で、デフォルトメソッドを必ずしもオーバーライド(上書き実装)する必要はありません。
つまり、実装クラスのオブジェクトを通じて、インターフェースで定義されたデフォルトメソッドをそのまま呼び出すことができます。
例1:デフォルトメソッドをそのまま利用する
interface MyInterface {
public static int num = 100;
public default void display() {
System.out.println("display method of MyInterface");
}
}
public class InterfaceExample implements MyInterface {
public static void main(String args[]) {
InterfaceExample obj = new InterfaceExample();
obj.display();
}
}
実行結果
display method of MyInterface
デフォルトメソッドのオーバーライド
結論から述べると、Javaのデフォルトメソッドはオーバーライド可能です。実装クラス側で同じ名前・同じ引数のメソッドを定義すれば、インターフェースのデフォルト実装を上書きして、独自の処理に置き換えることができます。
例2:デフォルトメソッドをオーバーライドする
interface MyInterface {
public static int num = 100;
public default void display() {
System.out.println("display method of MyInterface");
}
}
public class InterfaceExample implements MyInterface {
// デフォルトメソッドをオーバーライド
public void display() {
System.out.println("display method of class");
}
public static void main(String args[]) {
InterfaceExample obj = new InterfaceExample();
obj.display();
}
}
実行結果
display method of class
補足:元のデフォルト実装を呼び出したい場合
オーバーライドしたクラスの中から、インターフェース側の元の実装を呼び出したい場合は、次のように「インターフェース名.super.メソッド名()」の形式で記述します。
@Override
public void display() {
MyInterface.super.display(); // インターフェースの元の実装を呼び出し
System.out.println("display method of class");
}
このように、デフォルトメソッドは「必要ならそのまま使い、必要なら上書きする」柔軟な設計を可能にする機能です。既存のインターフェースに新たなメソッドを追加しても、実装クラスへの影響を最小限に抑えられるため、ライブラリやAPIの進化に広く活用されています。
-
Javaのデフォルトメソッドで菱形継承問題(ダイアモンド問題)を解決する方法
継承とは継承とは、あるクラスが別のクラスのプロパティやメソッドを受け継ぐ、クラス間の関係のことです。Javaでは「extends」キーワードを使って、次のように定義します。public class A extends B{ }性質を引き継ぐ側のクラスをサブクラス(子クラス)、引き継がれる側のクラスをスーパークラス(親クラス)と呼びます。継承が行われると、スーパークラスのメンバーのコピーがサブクラスのオブジェクト内に作られます。そのため、サブクラスのオブジェクトを使えば、親クラスと子クラスの両方のメンバーにアクセスできます。多重継承とは継承には、単一継承、多段継承、階層継承、多重継承、ハイブリッ
-
JavaでJTextAreaに行番号を表示する方法【DocumentListener活用】
JTextAreaはJTextComponentクラスのサブクラスであり、複数行のテキストを表示したり、ユーザーにテキストを入力させたりできるSwingのテキストコンポーネントです。また、CaretListenerインターフェースを実装することで、キャレット(カーソル)の移動イベントを監視することも可能です。 しかし、JTextAreaはデフォルトでは行番号を表示しません。行番号を表示したい場合は、DocumentListenerインターフェースを使ってドキュメントの変更(文字の挿入・削除など)を検知し、その都度行番号を再描画する仕組みを自前で実装する必要があります。 実装のポイント 行番号