Java『継承の使い方』サブクラスとスーパークラス|メソッドのオーバーライドとは?

Java≫継承の使い方≫サブクラスとスーパークラス_メソッドのオーバーライドとは? Javaプログラミング入門

【本サイトではGoogleアドセンス、または、アフィリエイト広告を利用しています。】

継承とは?

Javaの大きな特徴の1つに継承があります。

継承とは、クラスの特性を引き継いだクラスを作成することです。

クラスの特性とは、具体的に言うと、フィールドやメソッドなどメンバのことです。

継承を使えば、オリジナルのクラスが持つフィールドやメソッドを引き継ぐ形で
新しいクラスを作ることができます。

 リレーでバトンを渡す人

例えば、あるクラスを使っていて、新しい機能を足したい場合、
元のクラスはオリジナルとして触らずに、そのまま残しておきたいことがあります。

そんな時、継承を使えば、新機能を持ったクラスを別のクラスとして定義できます。

また、ある部分までベースとなる動きは同じだけど、
そこから先の機能はそれぞれ異なってくる
という場合に、

プロトタイプのクラスを作って、
方向性の違う派生クラスを継承を使っていろいろ作り出すこともできます。

Javaでは、継承される側のオリジナルのクラスをスーパークラス、
継承する側の派生クラスをサブクラス
と呼びます。

クラスについては、以下を参照してください。

継承を使うメリットとは?

わざわざややこしい継承を使わなくても、別に新しいクラスを作って、
そこに同じメンバを定義すればいいだけじゃないの?

確かにそれでも同じ動きは実現できます。でも、それだとこんな問題が起こります。

もし、何か不具合や事情が変わって、
フィールド名やメソッドの処理内容を書き換える必要が出てきたらどうでしょう?

同じフィールドやメソッドを持つすべてのクラスを洗い出して、
すべてに同じ変更を加える必要が出てきます。

 パソコンが動かず怒る人

そんなことをしなくても、継承を使うことで、
オリジナルのクラスが持つメンバだけ書き換えれば、
それを引き継いでいるすべてのクラスに同じ変更が反映されます。

このように、プログラムをできるだけシンプルにする、
メンテナンス性を上げるという点
でも、継承を使うことにメリットがあります。

継承の使い方(サンプルコード)

それでは、今から継承の使い方をサンプルコードで見ていきましょう。

まずは、ロボット君をクラスとして作りました。
エネルギーをフィールドに持ち、なんと、あいさつができます。

ロボット

package robot;

//クラス:ロボット
public class Robot {

	// フィールド:エネルギー
	public int energy;

	// メソッド:あいさつ
	public void greeting() {

		System.out.println("ヨロシクオネガイシマス!エネルギーハ【" + energy + "】デス!");
	}

}

では、ここで、ロボット君をスーパークラスとして、戦士型のロボットを作ってみます。

戦士型ロボットは、ステータスに攻撃力を持ち、剣を振ることができます!

package robot;

//クラス:戦士型ロボット
public class WarriorRobot extends Robot {

	// フィールド:攻撃力
	public int attackPower;

	// メソッド:剣を振る
	public void swordAttack() {

		System.out.println("剣を振るぜ。オレの攻撃力は【" + attackPower + "】だぜ。");
	}

}

同じく、ロボット君をスーパークラスとして、魔法使い型のロボットを作ります。

魔法使い型ロボットは、ステータスに魔法力を持ち、魔法を使うことができます!

package robot;

// クラス:魔法使い型ロボット
public class WizardRobot extends Robot {

	// フィールド:魔法力
	public int magicPower;

	// メソッド:魔法を使う
	public void magicAttack() {

		System.out.println("魔法を使うざます。ミーの魔法力は【" + magicPower + "】ざます。");
	}

}

ということで、Robotをスーパークラスとして、
サブクラスを2つ作成しましたが、ここで注目して欲しいコードは以下です。

public class WarriorRobot extends Robot {

クラスを継承して新しくクラスを作る時は、宣言時に「extends」のワードを使います。
このように記載することで、Robotクラスのメンバをすべて引き継ぐことができます。

では、さっそく作成したサブクラスを、Exampleクラスに用意した
mainメソッドからそれぞれ呼び出して動かしてみましょう!

package example;

import robot.WarriorRobot;
import robot.WizardRobot;

// クラス:メイン処理実行用
public class Example {

	// メイン処理
	public static void main(String[] args) {

		// 戦士型ロボット作成
		WarriorRobot warriorRobo = new WarriorRobot();

		// 能力の設定
		warriorRobo.energy = 200;
		warriorRobo.attackPower = 100;

		// あいさつ
		warriorRobo.greeting();
		
		// 剣を振る
		warriorRobo.swordAttack();


		// 魔法使い型ロボット作成
		WizardRobot wizardRobo = new WizardRobot();

		// 能力の設定
		wizardRobo.energy = 50;
		wizardRobo.magicPower = 300;

		// あいさつ
		wizardRobo.greeting();

		// 魔法を使う
		wizardRobo.magicAttack();

	}

}

各クラスの構成は以下のようにしています。

Java_継承のサンプルコード構成

パッケージの使い方や、別のクラスをインポートする方法については、以下を参照してください。

実行結果は以下です。

ヨロシクオネガイシマス!エネルギーハ【200】デス!
剣を振るぜ。オレの攻撃力は【100】だぜ。
ヨロシクオネガイシマス!エネルギーハ【50】デス!
魔法を使うざます。ミーの魔法力は【300】ざます。

戦士ロボと魔法使いロボが誕生しました!

と、ここで、どちらのサブクラスも、
スーパークラスが持つフィールド「energy」とメソッド「greeting」を
独自に定義することなく呼び出せていることに気づいたでしょうか?

このように、サブクラスでは、スーパークラスの持つ特性を
自分で定義したかのように呼び出して使うことができる
のです。

メソッドのオーバーライドについて

継承の使い方を覚えたところで、もう1つ大きな特徴を説明します。

スーパークラスの持つメソッドですが、
それぞれ派生したサブクラスすべてにとって使い勝手が良いかというと
そうではありません。

場合によっては、サブクラスの特性に合わないので、
処理を書き替えたい時も出てきます。

 困った人

そんな時に使えるのが、メソッドのオーバーライドという特性です。

オーバーライドとは、サブクラス内にスーパークラスと同じ名前の
メソッドを定義して、処理を上書きすること
です。

ということで、先ほどの例を使って説明します。

ロボット君のあいさつですが、ロボット感が強すぎると思いませんか?

せっかく戦士や魔法使いを作ったのに、
カタカナであいさつされるとちょっと世界観が壊れます。

なので、それぞれの雰囲気に合うように、
あいさつメソッドをオーバーライドしてみます!

package robot;

//クラス:戦士型ロボット
public class WarriorRobot extends Robot {

	// フィールド:攻撃力
	public int attackPower;

	// メソッド:剣を振る
	public void swordAttack() {

		System.out.println("剣を振るぜ。オレの攻撃力は【" + attackPower + "】だぜ。");
	}

	// メソッド:あいさつ(オーバーライド)
	public void greeting() {

		System.out.println("よろしくだぜ!エネルギーは【" + energy + "】だぜ!");
	}
	
}
package robot;

// クラス:魔法使い型ロボット
public class WizardRobot extends Robot {

	// フィールド:魔法力
	public int magicPower;

	// メソッド:魔法を使う
	public void magicAttack() {

		System.out.println("魔法を使うざます。ミーの魔法力は【" + magicPower + "】ざます。");
	}
	
	// メソッド:あいさつ(オーバーライド)
	public void greeting() {

		System.out.println("よろしくざます!エネルギーは【" + energy + "】ざます!");
	}

}

実行結果は以下です。

よろしくだぜ!エネルギーは【200】だぜ!
剣を振るぜ。オレの攻撃力は【100】だぜ。
よろしくざます!エネルギーは【50】ざます!
魔法を使うざます。ミーの魔法力は【300】ざます。

いい感じざます!

あ、うつっちゃいましたね。こいつはうっかりだぜ!

このような感じで、サブクラスに同じメソッドを定義した場合は、
スーパークラスよりもサブクラス側の定義が優先されて処理が実行されます!

まとめ

Javaの継承について以下説明しました。

・継承の特徴とメリット

・継承の使い方(サンプルコード)

・メソッドのオーバーライド

継承はJavaの大きな特徴の1つです。

オブジェクトという概念を理解する上でも重要な構文なので、
よく理解して使い方をマスターしましょう!

タイトルとURLをコピーしました