抽象クラス: 共通の骨格

共通コード + 抽象メソッド。インスタンス化不可。

abstract
抽象。インスタンス化不可。
具象クラス
インスタンス化可能。
テンプレートメソッド
骨格を定義し詳細を子に任せる。
Cookie Mold

抽象クラスは「クッキーの型」。 型自体は食べられない(インスタンス化不可)。 でも型があれば、色々な生地(具象クラス)でクッキーが作れる。

抽象クラス

abstract class, abstract method
// 抽象クラス
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 Interface, Template Method
// 抽象クラス 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 パターンを使って処理フローを定義してください。

次のステップ