Java
第10回
Javaの多態性|アップキャストと動的ディスパッチ
多態性(ポリモーフィズム)、アップキャスト、動的メソッドディスパッチ、instanceofの使い方と設計上の注意、失敗例を学びます。
結論:多態性は「親型の参照で子オブジェクトを扱い、実行時に適切なメソッドが選ばれる」仕組み
同じ型(例:Animal)の参照変数に、Dog や Cat のインスタンスを代入できます。メソッド呼び出しは実際のオブジェクトの型に基づいて決まります(動的ディスパッチ)。
アップキャスト
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」の記事
人気記事
- TS2307: Cannot find module '@components/Widget601' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget591' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget581' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget571' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget561' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget551' or its corresponding type declarations の原因と解決法
学習ルート
体系的に学びたい方はこちらから。
エラー解決コース →あわせて読みたい
- Javaの継承オーバーライドの前提
- Javaの例外処理同じ講座の次の回
- Javaのクラスとオブジェクトメソッド設計
- Javaの関数型プログラミングinterfaceと関数型
- Javaプログラミングのベストプラクティス設計パターン