1. 導入:なぜクラスとインターフェースの理解が重要なのか
Javaは「オブジェクト指向」という考え方に基づいた言語です。その中心となるのが「クラス」と「インターフェース」です。これらを正しく理解することで、コードの重複を防ぎ、後から変更に強い「保守性の高いプログラム」を書くことができます。今回は、初心者の方が必ずぶつかる「継承」「多態性(ポリモーフィズム)」、そしてJava 8以降に追加された便利なインターフェース機能について解説します。
2. 基礎知識:クラスとインターフェースの役割
クラスは、データと処理をまとめた「設計図」です。
インターフェースは、クラスが守るべき「契約書」のようなものです。どのようなメソッドを持つべきかを定義しますが、中身の実装はクラス側に任せます。
継承(Inheritance)は、あるクラスの機能を別のクラスに引き継ぐ仕組みです。
多態性(Polymorphism)は、「同じインターフェースを持つ異なるクラスを、同じように扱える」仕組みです。これにより、プログラムの柔軟性が飛躍的に向上します。
3. 実装とサンプルプログラム
Java 8以降、インターフェースは進化しました。defaultメソッドを使えば、インターフェース側でデフォルトの処理を提供できます。また、Java 9からはprivateメソッドを使って、インターフェース内の処理を整理できるようになりました。
以下のコードで、実際にこれらを確認してみましょう。
// インターフェースの定義
interface Animal {
// 抽象メソッド(実装は子クラスで行う)
void sound();
// defaultメソッド(実装を持つことができる)
default void sleep() {
System.out.println("Zzz...(デフォルトの睡眠処理)");
// privateメソッドを呼び出し可能
logAction("sleep");
}
// privateメソッド(インターフェース内部の共通処理として使用)
private void logAction(String action) {
System.out.println("ログ記録: " + action + " が実行されました。");
}
}
// 継承(実装)クラス
class Dog implements Animal {
@Override
public void sound() {
System.out.println("ワン!");
}
}
// 実行クラス
public class Main {
public static void main(String[] args) {
// 多態性の利用:Animal型としてDogを扱う
Animal myPet = new Dog();
myPet.sound(); // Dogの処理が呼ばれる
myPet.sleep(); // インターフェースのdefaultメソッドが呼ばれる
}
}
4. 応用・注意点:現場で陥りやすい罠
実務で意識すべきポイントがいくつかあります。
継承の乱用を避ける:
「継承」は強力ですが、親子関係が深すぎると修正が困難になります。現場では「迷ったら継承よりインターフェース(委譲)」という設計が好まれることが多いです。
defaultメソッドの衝突:
複数のインターフェースを実装する際、同じ名前のdefaultメソッドが存在するとコンパイルエラーになります。その場合は、クラス側で必ずオーバーライドして、どちらのメソッドを使うか(または独自実装するか)を明示する必要があります。
まとめ:
まずは「インターフェースで契約を結び、クラスで詳細を実装する」という流れを意識してください。これがJava開発の最も標準的で美しい設計パターンです。ぜひ、ご自身の環境でコードを動かして、動きの違いを確認してみてくださいね!

コメント