Javaのdefaultメソッドの使い方を解説!初心者でもわかるインターフェースの進化ポイント
生徒
「先生、Javaのインターフェースにdefaultメソッドっていうのがあるって聞いたんですけど、どういうものなんですか?」
先生
「良いところに気づいたね。Java 8から導入されたdefaultメソッドは、インターフェースにも実装付きのメソッドが書けるようにする新しい仕組みなんだよ。」
生徒
「でも、インターフェースって本来は実装を持たない設計じゃなかったんですか?」
先生
「そう、それが基本だったけど、Javaの進化によってdefaultメソッドが追加されて、もっと柔軟に設計できるようになったんだ。それじゃ、使い方と注意点を一緒に見ていこう!」
1. defaultメソッドとは?
Javaのdefaultメソッドとは、インターフェースの中に具体的な処理内容を持ったメソッドを定義できる機能です。Java 8で導入され、既存のインターフェースに後からメソッドを追加しても、実装クラス側の互換性を保つために設計されました。
通常、インターフェースはabstractなメソッドしか持てませんでしたが、defaultキーワードを使うことで、中身のあるメソッドを書くことが可能になりました。
2. Javaでのdefaultメソッドの基本的な書き方
Javaのdefaultメソッドは、次のようにdefaultキーワードを使って定義します。
public interface Greeting {
default void sayHello() {
System.out.println("こんにちは!");
}
}
このように書くことで、Greetingインターフェースを実装するすべてのクラスでsayHello()メソッドがそのまま利用可能になります。
3. 実装クラスでdefaultメソッドを使う例
インターフェースのdefaultメソッドを実装クラスでそのまま使う、またはオーバーライドするサンプルを見てみましょう。
public interface Greeting {
default void sayHello() {
System.out.println("こんにちは!");
}
}
public class JapaneseGreeting implements Greeting {
// オーバーライドしない場合は、GreetingのsayHello()がそのまま使われる
}
public class EnglishGreeting implements Greeting {
@Override
public void sayHello() {
System.out.println("Hello!");
}
}
こんにちは!
Hello!
JapaneseGreetingではsayHello()をそのまま使用しており、EnglishGreetingでは独自にオーバーライドしています。このように、defaultメソッドは柔軟に扱うことができます。
4. 複数インターフェースとdefaultメソッドの衝突
Javaでは、複数のインターフェースを同時にimplementsすることが可能ですが、同名のdefaultメソッドが複数あるとコンパイルエラーになります。
public interface A {
default void show() {
System.out.println("Aのshow");
}
}
public interface B {
default void show() {
System.out.println("Bのshow");
}
}
public class MyClass implements A, B {
@Override
public void show() {
A.super.show(); // または B.super.show()
}
}
このような場合、クラス側でどちらのメソッドを使うのかをインターフェース名.super.メソッド名で明示する必要があります。
5. defaultメソッドの使い道とメリット
Javaのdefaultメソッドは、以下のような場面で役立ちます。
- 既存のインターフェースに機能追加したいとき
- 共通的な処理をインターフェース側で提供したいとき
- 実装クラスの負担を減らしたいとき
たとえば、ログ出力やバリデーション処理など、複数のクラスで共通して使う処理をdefaultメソッドにしておけば、コードの重複を減らせます。
6. defaultメソッドと抽象メソッドの違い
defaultメソッドとabstractメソッドの違いをしっかり理解しておきましょう。
- defaultメソッド:インターフェース内に処理を書ける。オーバーライドは任意。
- abstractメソッド:実装クラスで必ずオーバーライドが必要。処理は書けない。
この違いを理解すると、インターフェースをより柔軟に設計できるようになります。
7. staticメソッドとの違いにも注意
Javaのインターフェースにはstaticメソッドも定義できます。defaultメソッドとの主な違いは、呼び出し方です。
public interface Util {
static void printInfo() {
System.out.println("情報表示");
}
}
Util.printInfo()のように、クラス名から直接呼び出します。一方、defaultメソッドは実装クラスのインスタンス経由で呼び出します。