1.かんたんに、継承とは?
- “親クラスの機能を子クラスが引き継ぐ仕組み”
- 親クラス(基底クラス):共通の機能を持つ
- 子クラス(派生クラス):親の機能をそのまま使える+独自機能を追加できる
2. 継承の基本イメージ(家族の遺伝より“機能の引き継ぎ”)
- 初学者は「親子関係」と言われてもピンと来ないので、
“機能の引き継ぎ” と説明するのが一番わかりやすい。
例:
- 親クラス(基底クラス):共通の機能を持つ
- 子クラス(派生クラス):親の機能をそのまま使える+自分の機能を追加できる
親クラス:調理器具
class Cooker {
void heat() {
System.out.println("加熱する");
}
}
子クラス:たい焼き器(Cooker を継承)
class TaiyakiMaker extends Cooker {
void pourBatter() {
System.out.println("生地を流し込む");
}
void addFilling() {
System.out.println("具材を入れる(あんこ・カスタードなど)");
}
}
使う側
TaiyakiMaker maker = new TaiyakiMaker();
maker.heat(); // 親クラスの機能
maker.pourBatter(); // 子クラスの独自機能
maker.addFilling(); // 子クラスの独自機能
👉 たい焼き器は「調理器具の一種」なので、heat() を自然に使える。
3.オーバーライド(上書き)
継承の本質は「親の機能をそのまま使う」だけでなく、
必要に応じて作り直せる(オーバーライド)こと。
オーバーライド(焼き方を変える)
- たい焼き器の加熱方法を特別にしたい場合は、
親の heat() を上書き(オーバーライド) できる
class TaiyakiMaker extends Cooker {
@Override
void heat() {
System.out.println("両面から挟んで加熱する");
}
}
👉 同じメソッド名で書き直すと、子クラスの動きに置き換わる。
4.初学者がつまずきやすいポイント
❌ 継承すると「全部コピーされる」
→ コピーではなく 参照している。
親クラスを変更すると子クラスにも影響するのはこのため。
❌ なんでも継承すればよい(is-a関係)
→ 継承は “〜は〜である(is-a)” の関係のときだけ。
- Dog は Animal(OK)
- Car は Vehicle(OK)
- Dog は Robot(NG:似てても別物)
❌ extends したら自動で全部理解できる
→ 実際は “親のメソッドを呼んでいるだけ”。
呼び出しの流れを図で示すと理解が早い。
図解:継承のイメージ
Cooker(親:調理器具)
├─ heat() ← 加熱する
└─ clean() ← 掃除する
↓ extends
TaiyakiMaker(子:たい焼き器)
├─ heat() ← オーバーライド(たい焼き器の加熱方法に変更)
├─ clean() ← 親のまま使う
└─ pourBatter() ← 子の独自機能(生地を流す)
5.継承を使うべき場面
- 共通の処理をまとめたい
- 子クラスごとに振る舞いを変えたい(オーバーライド)
- “〜は〜である” の関係が成り立つ
まとめ
- 継承 = 機能の引き継ぎ
- extends で親クラスを指定する
- 親のメソッドをそのまま使える
- 必要ならオーバーライドで作り直せる
- “is-a” の関係のときだけ使う