StackShelf
Java 第10回

Javaの多態性|アップキャストと動的ディスパッチ

多態性(ポリモーフィズム)、アップキャスト、動的メソッドディスパッチ、instanceofの使い方と設計上の注意、失敗例を学びます。

2分で読める
Java多態性オブジェクト指向プログラミング

結論:多態性は「親型の参照で子オブジェクトを扱い、実行時に適切なメソッドが選ばれる」仕組み

同じ型(例:Animal)の参照変数に、DogCat のインスタンスを代入できます。メソッド呼び出しは実際のオブジェクトの型に基づいて決まります(動的ディスパッチ)。

アップキャスト

Animal a = new Dog("Pochi");
a.speak(); // Dog の speak が呼ばれる

Animal[] zoo = { new Dog("A"), new Cat("B") };
for (Animal x : zoo) {
    x.speak(); // それぞれの実装
}

ダウンキャストと instanceof

if (a instanceof Dog d) {
    d.fetch(); // Pattern matching for instanceof (Java 16+)
}

失敗例:確認なしのダウンキャスト

Cat c = (Cat) a; // a が Dog なら ClassCastException

必ず instanceof で確認するか、多態性で共通インターフェースに処理を寄せます。

多態性のメリット

  • 新しい子クラス追加が既存コードへの影響を最小化
  • テストでモック実装に差し替えやすい
  • 条件分岐(if type == Dog)を減らせる

まとめ

多態性はOOPの核心で、拡張性の高い設計につながります。不適切なキャストは ClassCastException の原因です。次回は例外処理で実行時エラーに備えます。

まとめ

Javaの多態性は親型参照で子オブジェクトを扱い、実行時にオーバーライドされたメソッドが呼ばれます。instanceofなしのダウンキャストはClassCastExceptionの典型です。動物や図形の配列でspeak/areaをループ呼び出しして体験しましょう。

次にやること

Paymentインターフェース(または抽象クラス)とCredit/Wallet実装を作り、Listに混在させてpay()をループ実行してください。

よくある質問

オーバーロードとオーバーライドの違いは?

オーバーロードは同名・異なる引数(コンパイル時決定)、オーバーライドは子が親メソッドを再定義(実行時決定)です。

static メソッドはオーバーライド?

いいえ、隠蔽(hide)です。多態性の対象はインスタンスメソッドです。

private メソッドは?

オーバーライド不可。子クラス固有のprivateメソッドは別物です。

多態性なしで書けますか?

可能ですがif-else地獄になりがちです。共通の抽象(interface/abstract class)を検討しましょう。

record と多態性は?

recordは主にデータ保持。interface実装で多態性に組み込めます。

次に読むべき記事

同カテゴリ「Java」の記事

学習ルート

体系的に学びたい方はこちらから。

エラー解決コース →

あわせて読みたい