こんにちは!バナナドリームのエンジニアブログへようこそ🍌✨
現役エンジニアの視点から、Java学習者が必ずと言っていいほど直面する大きな壁、「継承(Inheritance)」について解説します。
「継承=親の機能を引き継ぐこと」という基本は知っていても、現場でどう使い、何に気をつけるべきかまで理解できている人は意外と少ないものです。
今回は、初心者の方にはイメージしやすく、中級者以上の方には「設計の指針」となるような内容をお届けします!
1. 継承とは?「差分」だけを書くという考え方
継承とは、あるクラス(親クラス)の性質を、別のクラス(子クラス)が受け継ぐことです。
親クラス(スーパークラス): 基本となる共通機能を持つクラス
子クラス(サブクラス): 親の機能を引き継ぎつつ、独自の機能を追加したクラス
例えば、「動物クラス(Animal)」に「食べる」というメソッドがあれば、それを継承した「犬クラス(Dog)」や「猫クラス(Cat)」は、一から「食べる」処理を書く必要はありません。「動物としての基本機能 + 犬特有の機能」だけを書けば良いのです。
2. 継承の基本:extends キーワード
Javaでは extends を使って継承を表現します。
// 親クラス
class Animal {
String name;
void eat() {
System.out.println(name + "が食事をしています。");
}
}
// 子クラス
class Dog extends Animal {
void bark() {
System.out.println("ワンワン!");
}
}
現場テクニック:オーバーライド(Override)
親クラスのメソッドを子クラスで独自の動きに書き換えることをオーバーライドと呼びます。
現場の視点: 必ず @Override アノテーションを付けましょう。綴り間違いなどで意図せずオーバーライドに失敗した際、コンパイルエラーとして教えてくれるため、バグを未然に防げます。
3. 知っておきたい「現場での継承」の注意点
継承は便利ですが、現場では「継承よりも委譲(Composition)」という言葉があるほど、慎重に使われます。
① 「is-a関係」が成立するか?
継承を使う絶対条件は、「子クラス is a 親クラス(子クラスは親クラスの一種である)」という関係が成り立つことです。
〇 Dog is an Animal. (犬は動物である)
× Engine is a Car. (エンジンは車である)
これは継承ではなく、車がエンジンを「持っている」ので「has-a関係(委譲)」で設計すべきです。
② 継承の深さに注意
現場で継承の階層が3つも4つも重なっていると、コードの全容を把握するのが困難になります。 「このメソッド、結局どこで定義されてるんだ…?」と親クラスを延々と遡る作業は開発効率を下げます。設計は極力シンプルに保つのがプロの技です。
③ final 修飾子による継承の禁止
これ以上継承させたくないクラスには final を付けます。 Javaの String クラスも実は final です。勝手に機能を上書きされると困る重要なクラスは、継承を禁止することで安全性を高めています。
4. 【実践例】コンストラクタと super
継承関係にあるクラスでは、親クラスのコンストラクタを呼び出す super() の理解が不可欠です。
class Employee {
String name;
Employee(String name) {
this.name = name;
}
}
class Engineer extends Employee {
String skill;
Engineer(String name, String skill) {
// System.out.println("初期化中..."); // ← superの前に何か書くとコンパイルエラー!
super(name); // 親のコンストラクタを呼び出し、名前をセット
this.skill = skill;
}
}
子クラスのインスタンスを作る際、内部ではまず親クラスの部分が初期化され、その後に子クラスの拡張部分が作られるイメージです。
💡現場で継承が輝く瞬間:ポリモーフィズム
継承を使うと、Animal 型の変数に Dog や Cat を代入できるようになります。
Animal myPet = new Dog(); // 犬を「動物」として扱う
myPet.eat(); // 犬でも猫でも「食べる」という共通命令で動かせる!
これにより、種類が増えてもメインの処理を書き換えなくて済む「変更に強い設計」が実現できます!
5. まとめ:継承は「武器」にも「毒」にもなる
継承を正しく使うと、コードの重複が減り、修正範囲を最小限に抑えることができます。しかし、安易な継承はクラス同士をガチガチに固めてしまい、後の変更を難しくします。
初心者のうちは: まず extends で機能を拡張する便利さを体験してください。
慣れてきたら: 「これは本当に is-a 関係か?」「継承せずに、別のクラスをフィールドとして持つ(委譲)だけで十分ではないか?」と疑ってみてください。
この視点を持てるようになれば、あなたの設計スキルは一段階上がります!
バナナドリームは、一緒に働く仲間を募集中です!
プログラミングが好きな方、IT業界で成長したい方、大歓迎です。一緒に夢をかなえましょう!
最後までお読みいただき、ありがとうございました!😊
new articles新着記事
【NEWS】Java入門:継承についてやさしく解説
現役エンジニアの視点から、Java学習者が必ずと言っていいほど直面する大きな壁、「継承(Inheritance)」について 今回は、初心者の方にはイメージしやすく、中級者以上の方には「設計の指針」となるような内容をお届けします!
【News】配列とfor文で学ぶ!Javaの配列活用法とシステム開発現場でのリアルな使い方
Javaの配列とfor文の基本を初心者向けに解説。配列の仕組み、for文・for-eachとの組み合わせ、多次元配列の使い方まで、システム開発の現場で役立つ活用例とともにわかりやすく紹介します。
【News】Java入門:配列の必要性と基本文法をやさしく解説
Javaの配列(Array)の基本を初心者向けに解説。変数を並べる非効率なコードから卒業し、配列の宣言・初期化・取り出し方、lengthやfor文との組み合わせまでわかりやすく紹介します。

