オブジェクト指向の中でも「かっこいい」と言われるのがポリモーフィズムです。難しそうな名前ですが、要は「同じ命令なのに、相手によって違う動きをする」仕組みです。今日は45分で、オーバーライドとポリモーフィズムを理解し、動物たちに違う鳴き声を出させます。時間配分の目安は、説明10分、実践27分、振り返り8分です。
ポリモーフィズムとオーバーライド(目安10分・インプット)
まず「オーバーライド」とは、親クラスのメソッドを子クラスで上書きして、動作を変えることです。上書きするメソッドには `@Override` という目印を付けます。
そして「ポリモーフィズム(多態性)」とは、親クラスの型でまとめて扱いながら、実際の動作は各インスタンス(子)に応じて変わる性質のことです。
public class Animal {
void sound() {
System.out.println("...");
}
}
public class Dog extends Animal {
@Override
void sound() {
System.out.println("ワン");
}
}
【実践】動物の鳴き声を出し分ける(目安27分・手を動かす)
`Animal.java`、`Dog.java`、猫の `Cat.java`、そして `Main.java` を作ります。
public class Cat extends Animal {
@Override
void sound() {
System.out.println("ニャー");
}
}
public class Main {
public static void main(String[] args) {
Animal[] animals = { new Dog(), new Cat() };
for (Animal a : animals) {
a.sound(); // 実体に応じてワン/ニャー
}
}
}
`java Main` を実行すると、「ワン」「ニャー」と順に表示されます。注目したいのは、配列の型は `Animal` なのに、呼び出した `sound()` はそれぞれDogとCatの動作になっている点です。これがポリモーフィズムです。ループ側は「動物として鳴かせる」とだけ書けばよく、種類ごとの分岐が要りません。演習として、`Cow`(牛)クラスを追加し、配列に入れて鳴かせてみましょう。
よくある疑問・つまずきポイント
**@Overrideは必須ですか?**
なくても動きますが、付けておくと「親のメソッドを正しく上書きしているか」をコンパイラが確認してくれます。名前のタイプミスにも気づけるので、付ける習慣をおすすめします。
**なぜAnimal型でまとめると便利なのですか?**
種類が増えても、まとめて扱う側のコードを変えずに済むからです。新しい動物を追加しても、ループ部分はそのままで動きます。
まとめ(目安8分)
今日はオーバーライドとポリモーフィズムで、同じ呼び出しから実体ごとに異なる動作を引き出す方法を学びました。柔軟で拡張しやすい設計の核心です。明日は、動作の「約束」を定める「インターフェースと抽象クラス」に進みます。

コメント