【Java】楽して最強のクラスを作る!「継承」でコードの重複をゼロにする方法
はじめに
みなさんどうも、おげんです。
これまでの記事で、「勇者(Hero)」クラスを作って、メソッドやコンストラクタを実装してきました。
でも、ゲームを面白くするには他にも「魔法使い」や「武闘家」が必要ですよね。
さて、ここで皆さんに質問です。
新しく「魔法使い(Wizard)」クラスを作るとき、またイチから名前(name)やHP、歩く(walk)メソッドを書き直しますか…?
- 「同じコードを何度も書くのは、正直もう飽きた!」
- 「1箇所修正したら、全クラスを直して回るなんて無理…」
そんな「コピペ疲れ」を根こそぎ解消し、Javaの「部品化」を次のステージへ引き上げる魔法の呪文、それが「継承(Inheritance)」です。
これを使えば、すでにあるクラスのパワーをそのまま受け継いで、新しいクラスを「差分だけ」で爆速で作れるようになります。
まさに、楽して最強のプログラムを手に入れるための必須スキルです!
- 似たようなクラスをいくつも作っていて、管理が大変だと感じている人
- 「共通の機能」を一箇所でまとめて修正できるようにしたい人
- Javaの最重要ルール「継承(extends)」の仕組みをスッキリ理解したい人
継承は「差分プログラミング」である
プログラミングの世界で「継承(けいしょう)」とは、すでにあるクラスの機能を引き継いで、新しく作りたい部分(差分)だけを書くテクニックのことです。
「0から作る」のはもう終わり
例えば、RPGで「戦士(Warrior)」と「魔法使い(Wizard)」を作るとします。
どちらも「名前」や「HP」を持ち、「歩く(walk)」という行動は共通ですよね。
- 継承を使わない場合: 戦士クラスに「名前・HP・歩く」を書く。魔法使いクラスにも全く同じ内容をもう一度書く。(まさにコピペ地獄!)
- 継承を使う場合: 「キャラクター(Character)」という親クラスに共通のものを1回書くだけ。戦士と魔法使いはそれを「レンタル」して、自分専用の特技(斬る、呪文など)だけを書き足します。
親と子の関係
Javaでは、元になるクラスを「親クラス(スーパークラス)」、引き継いで新しく作るクラスを「子クラス(サブクラス)」と呼びます。
親から子へ、財産(変数やメソッド)をまるごと譲り受けるイメージです。
子がやるべきことは、「親にない自分だけの個性を出すこと」だけ。
これが、開発スピードを爆速にする秘密です。
魔法のキーワード「extends」の使い方
Javaで継承を使うときは、クラス名のあとに extends(拡張する) という単語を書き足すだけです。
実際のコードで比較!
まずは、ベースとなる「親(人間)」クラスを作ります。
// 親クラス(Human)
public class Human {
String name;
int hp;
public void walk() {
System.out.println(name + "はトボトボ歩いた。");
}
}次に、この「人間」を継承して「勇者(Hero)」クラスを作ります。
// 子クラス(Hero)
public class Hero extends Human { // 「Humanを拡張してHeroを作るよ」という意味
// 【注目!】nameやhp、walk()は書かなくてOK!
public void attack() {
System.out.println(name + "の会心の一撃!");
}
}「えっ、これだけでいいの?」
はい、これだけでいいんです!
Hero クラスの波カッコ { } の中には、name も hp も walk() も書いていません。
しかし、extends Human と書いた瞬間に、これらを「自分のもの」として使えるようになります。
使うときのイメージ
呼び出す側(Mainメソッドなど)では、まるで Hero クラスに最初から全部書いてあったかのように操作できます。
Hero h = new Hero();
h.name = "ミナト"; // 親から譲り受けた変数
h.walk(); // 親から譲り受けたメソッド
h.attack(); // 自分(子)で追加したメソッド「親が持っているものは子のもの。さらに子は新しい特技を追加できる」。
これが extends のパワーです!
修正が一瞬で終わる!「保守性」のすごさ
「コピペでいいじゃん」と思っていた読者の人たちが、一番驚くのがこのポイントです。
もし、ゲームの仕様変更で「歩く(walk)」の動きを、「1歩ごとにスタミナを消費する」という処理に変えたくなったらどうなるでしょうか?
継承を使わない場合(地獄の作業)
新しいジョブを作るたびに、同じコードを何度も書くことになります。
// 戦士クラス
public class Warrior {
String name;
int hp;
public void walk() { System.out.println(name + "は歩いた"); } // 同じ
public void attack() { /* 戦士の攻撃 */ }
}
// 魔法使いクラス
public class Wizard {
String name;
int hp;
public void walk() { System.out.println(name + "は歩いた"); } // また同じ
public void cast() { /* 魔法 */ }
}戦士、魔法使い、武闘家、遊び人……。
100種類のジョブを作っていたら、100個のクラスファイルを全部開いて、同じ修正を100回繰り返さなければなりません。
途中でコピペミスをしたら、特定のジョブだけスタミナが減らないというバグも生まれてしまいます。
継承を使っている場合(一瞬で完了!)
共通部分は「親」に任せて、自分たちは「自分にしかできないこと」に集中します。
// 親クラスで一括管理!
public class Human {
String name;
int hp;
public void walk() { System.out.println(name + "は歩いた"); }
}
// 子クラスは「自分専用」だけ書けばOK
public class Warrior extends Human {
public void attack() { /* 戦士の攻撃 */ }
}
public class Wizard extends Human {
public void cast() { /* 魔法 */ }
}修正するのは、親クラス(Human)の walk() メソッドだけです。
親クラスを一箇所直せば、それを継承している子クラスたちは自動的に、一斉に新しい動きに変わります。
「一元管理」ができる強み
「共通のルールは親クラスにまとめておく」。
これによって、プログラムが大きくなっても「ここさえ直せば大丈夫」という安心感が生まれます。
これを専門用語で保守性が高いと言います。
まとめ:「継承」は最強のショートカット術
今回は、既存のクラスをパワーアップさせて再利用する 「継承(extends)」 について学びました。
最後におさらいです。
- 継承とは: 親クラスの「変数」や「メソッド」を、子クラスがそのまま引き継ぐ仕組み。
- キーワードは
extends: 「class 子クラス名 extends 親クラス名」と書くだけ。 - 最大のメリット: 同じコードを何度も書く手間が省け、修正も一箇所で済む(保守性が高い)。
プログラミングは「楽」をしていい!
初心者のうちは、「全部自分で書かないと実力がつかないかも…」と不安になるかもしれません。
でも、Javaの世界では「いかに楽をして、ミスのないコードを書くか」が正義です。
継承を使いこなせれば、あなたはもう「一発屋の勇者」ではありません。
何百ものジョブやキャラクターを効率よく生み出し、管理できる「ゲームマスター」への道を歩み始めています。
「これ、前も書いたな?」と思ったら、それが継承を使う合図です。
どんどん楽をして、もっとクリエイティブな部分に時間を使っていきましょう!
今回も最後まで読んでいただき、ありがとうございました!
