抽象クラス: 共通の骨格
共通コード + 抽象メソッド。インスタンス化不可。
abstract
抽象。インスタンス化不可。
具象クラス
インスタンス化可能。
テンプレートメソッド
骨格を定義し詳細を子に任せる。
抽象クラス
// 抽象クラスpublic abstract class Animal { protected String name;
// 通常のコンストラクタ public Animal(String name) { this.name = name; }
// 通常のメソッド(実装あり) public void sleep() { System.out.println(name + " is sleeping"); }
// 抽象メソッド(実装なし) public abstract void makeSound();}
// 具象クラスpublic class Dog extends Animal { public Dog(String name) { super(name); }
@Override public void makeSound() { System.out.println("Woof!"); }}実行結果
Woof!\nRex is sleeping
Bad
// ❌ Bad: 抽象メソッドを実装しないpublic class Cat extends Animal { // makeSound() を実装しない // コンパイルエラー!}Good
// ✅ Good: 全ての抽象メソッドを実装public class Cat extends Animal { public Cat(String name) { super(name); }
@Override public void makeSound() { System.out.println("Meow!"); }}パターン
// 抽象クラス vs インターフェース
// 抽象クラス// - 状態(フィールド)を持てる// - コンストラクタを持てる// - 単一継承のみabstract class Vehicle { protected int speed; public void accelerate() { speed++; } public abstract void brake();}
// インターフェース// - 状態を持てない(定数のみ)// - コンストラクタなし// - 多重継承可能interface Drivable { void drive(); void stop();}
// 組み合わせpublic class Car extends Vehicle implements Drivable { @Override public void brake() { speed = 0; }
@Override public void drive() { accelerate(); }
@Override public void stop() { brake(); }}
// テンプレートメソッドパターンabstract class DataProcessor { public final void process() { // final で上書き禁止 readData(); processData(); writeData(); } protected abstract void readData(); protected abstract void processData(); protected abstract void writeData();} Tip: 状態が必要なら抽象クラス、契約だけならインターフェース。
合格ライン
抽象クラスを定義できる
インターフェースとの使い分けを説明できる
参考リンク
演習課題
課題1: 抽象クラス
Animal 抽象クラスを作成し、Dog と Cat で makeSound() を実装してください。
課題2: Template Method
Template Method パターンを使って処理フローを定義してください。