19.
継承
継承とは
既にあるクラスの機能を引き継いで、新しいクラスを作成する方法を継承(inheritance) といいます。元となるクラスのことをスーパークラスといい、引き継ぐ新しい子クラスをサブクラスといいます。サブクラスはスーパークラスのメソッドが引き継げます。
継承の例
つぎの例は、スーパークラス「キャラクター」を継承して「ウィザード」「ウォリアー」を定義したものです。スーパークラスの機能がそのままで、データを設定したり、新たに機能を追加できます。

- サブクラスは、スーパークラスからプロパティやメソッドを引き継ぐ
- サブクラスは、新たにプロパティやメソッドを定義できる
- サブクラスは、スーパークラスのプロパティやメソッドを上書きできる
extends
継承の基本
サブクラス(子クラス)がスーパークラス(親クラス)を継承するには、extendsを利用します。サブクラスが継承すると、スーパークラスの機能を利用できます。
修飾子 class サブクラス extends スーパークラス {
}
継承(extends)の例
スーパークラス(親クラス)
スーパークラスを「Character」とします。
public class Character {
}
サブクラス(子クラス)
サブクラス「Wizard」が「Character」を継承(extends)した場合です。
public class Wizard extends Character {
}
継承クラスの作成
ファイル構成
src/character/
├── App.java
├── Character.java
├── Wizard.java
└── Warrior.java
スーパークラスの作成
スーパークラス「Character」を作成し、フィールドとメソッドも定義しておきます。
Character.java
public class Character {
public String name;
public String job;
public int hp;
public int mp;
public int level;
public int exp;
public int attackPower;
public int defencePower;
public void greet(String message) {
System.out.println(message);
}
public void showStatus() {
System.out.println("Name: " + this.name);
}
}
サブクラスの作成
新規クラスダイアログで、サブクラスを作成します。継承するにはスーパークラスをパッケージ付きで設定します。パッケージが同じであれば省略できます。

Wizardクラス
スーパークラス「Character」を継承した、サブクラス「Wizard」が作成できました。
public class Wizard extends Character {
}
Warriorクラス
サブクラス「Warrior」も作成しておきます。
Warrior.java
public class Warrior extends Character {
}
メインプログラムの実行
メインプログラム「App」を作成し、Wizardのgreet() メソッドを実行してみましょう。
App.java
package rpg;
public class App {
public static void main(String[] args) {
Wizard wizard = new Wizard();
wizard.greet("こんにちは");
Warrior warrior = new Warrior();
warrior.greet("さようなら");
}
}
結果
greet() メソッドはスーパークラス「Character」に実装されていますが、サブクラス「Wizard」「Warrior」で実行できました。
こんにちは
さようなら
スーパークラスのフィールド値参照
スーパークラスにコンストラクタ追加
引数を「name」で指定して、スーパークラス「Character」にコンストラクタを追加します。
コンストラクタが追加されました。
Character.java
public Character(String name) {
super();
this.name = name;
}
フィールド値設定
コンストラクタでフィールド「level」「exp」の値を初期化します。「Character」のフィールド値は、サブクラス「Wizard」「Warrior」から参照できます。
Character.java
public Character(String name) {
super();
this.name = name;
this.level = 1;
this.exp = 0;
}
サブクラスクラスのコンストラクタ
スーパークラスにコンストラクタは、サブクラスで継承が必要です。エラー箇所をマウスオーバーして、コンストラクタを追加します。

Wizardクラス
サブクラス「Wizard」にコンストラクタが追加できました。
Wizard.java
public class Wizard extends Character {
public Wizard(String name) {
super(name);
}
}
Warriorクラス
同様に「Warrior」にもコンストラクタを追加します。
Warrior.java
public class Warrior extends Character {
public Warrior(String name) {
super(name);
}
}
super()
super() はスーパークラスのコンストラクタを実行します。コンストラクタに引数があれば、あわせて指定します。
スーパークラス
public コンストラクタ(引数) {
}
サブクラス
public コンストラクタ(引数) {
//スーパークラスのコンストラクタ実行
super(引数);
}
メインプログラムで確認
メインプログラム「App」でコンストラクタの引数を指定して、名前を確認してみましょう。
App.java
public static void main(String[] args) {
Wizard wizard = new Wizard("アリス");
wizard.greet("こんにちは");
wizard.showStatus();
Warrior warrior = new Warrior("ボブ");
warrior.greet("どーも");
warrior.showStatus();
}
確認
こんにちは
Name: アリス
どーも
Name: ボブ
サブクラスのフィールド値参照
「Wizard」「Warrior」の特徴にあわせて、フィールド値を設定します。また、「Character」には、各能力値をコンソール表示するよう修正します。
Wizard.java
public class Wizard extends Character {
public Wizard(String name) {
super(name);
this.job = "wizard";
this.hp = 10;
this.mp = 20;
}
}
Warrior.java
public class Warrior extends Character {
public Warrior(String name) {
super(name);
this.job = "warrior";
this.hp = 30;
this.mp = 0;
}
}
Character.java
public class Character {
...
public void showStatus() {
System.out.println("---- Status ----");
System.out.println("Name: " + this.name);
System.out.println("Job: " + this.job);
System.out.println("HP: " + this.hp);
System.out.println("MP: " + this.mp);
System.out.println("Lv: " + this.level);
System.out.println("Exp: " + this.exp);
System.out.println("attack: " + this.attackPower);
System.out.println("defence: " + this.defencePower);
}
...
}
メインプログラムで確認
メインプログラムを実行して、キャラクターのステータスを確認してみましょう。
結果
キャラクターのステータスが表示されました。
こんにちは
---- Status ----
Name: アリス
Job: wizard
HP: 10
MP: 20
Lv: 1
Exp: 0
Attack: 3
Defence: 5
--------
どーも
---- Status ----
Name: ボブ
Job: warrior
HP: 30
MP: 0
Lv: 1
Exp: 0
Attack: 10
Defence: 5
--------
演習
問題1
つぎの「Animal」クラスをスーパークラスとして、サブクラス「Dog」と「Cat」を作成してみましょう。
package zoo;
public class Animal {
public String type;
public String name;
public String crying;
public Animal(String name) {
super();
this.name = name;
}
public void walk() {
String message = this.name + "が歩いた";
System.out.println(message);
}
public void cry() {
System.out.println(this.crying);
}
public void escape() {
String message = this.name + "が逃げた";
System.out.println(message);
}
}
問題2
作成した「Dog」「Cat」クラスを使って、メインプログラムでwalk() メソッドを実行してみましょう。
問題3
作成した「Dog」「Cat」クラスを使って、メインプログラムでcry() メソッドを実行してみましょう。