← SEARCHABLE ARCHIVE
Java · 2026-07-26

Java 基礎からマスターまで — 第4回

継承とインタフェースで多型を使用する

INTERACTIVE READING MODE →

本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。

複数のオブジェクトを同じ方法で使用する必要がある場合は、インターフェイスと継承を利用できます。 呼び出すコードは、具体的なクラスよりも必要な役割に依存する方が変更に強い。

インターフェース

public interface Damageable {
    boolean isAlive();
    void takeDamage(int amount);
}

public final class Monster implements Damageable {
    private int health = 100;

    @Override
    public boolean isAlive() {
        return health > 0;
    }

    @Override
    public void takeDamage(int amount) {
        health = Math.max(0, health - amount);
    }
}

攻撃コードはモンスターではなくDamageableを受け取ればよい。 後で破壊可能な箱を追加しても同じ契約で処理することができる。

抽象クラスと継承

public abstract class Skill {
    private final String name;

    protected Skill(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public abstract void execute(Damageable target);
}

抽象クラスは、共通の状態と実装を共有しながら、一部の動作を子に委ねることができる。 継承は親のルールまで結合するので、単純なコード再利用のみのために深く作れば変更範囲が大きくなる。

多型

List<Damageable> targets = List.of(
    new Monster(),
    new TrainingDummy()
);

for (Damageable target : targets) {
    target.takeDamage(10);
}

同じ呼び出しをしても、実際のオブジェクトに合った実装が実行される。 呼び出し側はinstanceofですべての具体的なタイプをリストする必要はありません。

インタフェースは役割を表現し、抽象クラスは共通の基盤を提供します。 構成可能な小さなオブジェクトを組み合わせることができる場合、継承よりもその方法がより単純な場合も多い。