継承とは

既にあるクラスの機能を引き継いで、新しいクラスを作成する方法を継承(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() メソッドを実行してみましょう。