9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【わかりやすく解説‼】Javaのポリモーフィズムの使い方

Last updated at Posted at 2020-04-27

1.事前知識

事前知識として、上記リンクの内容が必要です。

2.ポリモーフィズムとは

  • ポリモーフィズム とは、 異なる処理 を持つオブジェクトを、 同一の操作 で扱うことができることを指す。
  • 操作している側 は、オブジェクトの 処理の違いを意識せず に操作を利用できる。
  • ポリモーフィズム は、 多様性多態性多相性 ともいう。
  • ポリモーフィズム は、 抽象クラス を継承したサブクラスのインスタンスを 抽象クラスの型 で扱うことで実現している。

3.抽象クラスとは

  • 抽象クラス とは、 継承されることを前提 に作られたクラスである。
  • 抽象クラス は、 インスタンス化できない 特徴を持っている。
  • 抽象クラス には、オーバーライド されることを前提とした「抽象メソッド」が定義できる。
  • 抽象クラス抽象メソッド には、「abstract修飾子」をつけて定義する。
  • 抽象メソッド には、 private / static / final 修飾子を付けることはできない。
  • 抽象クラス を利用するときは 抽象クラス を継承した サブクラス を定義し、 抽象メソッドオーバーライド する。
  • 抽象クラス を継承したクラスを 具象クラス という。

4.ポリモーフィズムの基本的な書き方

テストクラス
package パッケージ名;
public class メインクラス名{
    public static void main(String[] args) {
        // インスタンスの生成
        サブクラス名 変数名 = new サブクラス名();
        // 処理の実行
        変数名.抽象メソッド名(実引数)
    }
}
抽象クラス
package パッケージ名;
abstract class 抽象クラス名{
    // インスタンス変数の定義
    private 型名 変数名;

    // コンストラクタ(インスタンス生成時に実行される)
    抽象クラス名(型名 引数){
        初期化処理など
    }
    // 抽象メソッド
    abstract 抽象メソッド名(型名 引数);
}
サブクラス
package パッケージ名;
class サブクラス名 extends 抽象クラス名{
    // インスタンス変数の定義
    private 型名 変数名;

    // コンストラクタ(インスタンス生成時に実行される)
    サブクラス名(型名 引数){
        super(引数);
        初期化処理など
    }
    // オーバーライド(抽象メソッド)
    @Override
    抽象メソッド名(型名 引数){
        //処理
    }
}
  • 基本的な ポリモーフィズム は上記のように記述します。

5.事前準備

01.png

  1. Eclipseを起動し、 [ファイル(F)]→[新規(N)]→[Java プロジェクト] を選択する。
    02.png
  2. プロジェクト名に Test1 と入力し、 完了 ボタンをクリックする。
    03.png
  3. [ファイル(F)]→[新規(N)]→[クラス] を選択する。   
    05.png
  4. パッケージと名前に Test1 と入力し、 完了 ボタンをクリックする。
    06.png
  5. Test1.java が作成されたことを確認する。
    01.png
  6. 3と同様の手順でパッケージに Test1 、名前に Greeting と入力し、 abstract にチェックを入れ、 完了 ボタンをクリックする。
    02.png
  7. 3と同様の手順でパッケージに Test1 、名前に GoodMorning 、スーパークラスに Test1.Greeting と入力し、 完了 ボタンをクリックする。
    03.png
  8. 3と同様の手順でパッケージに Test1 、名前に Hello 、スーパークラスに Test1.Greeting と入力し、 完了 ボタンをクリックする。
    04.png
  9. 3と同様の手順でパッケージに Test1 、名前に GoodEvening 、スーパークラスに Test1.Greeting と入力し、 完了 ボタンをクリックする。
    05.png
  10. Test1.javaGreeting.javaGoodMorning.javaHello.javaGoodEvening.java が作成されれば成功。

6.記述例

Test1.java
package Test1;
public class Test1 {
    public static void main(String[] args) {
        // インスタンスの生成
    	Greeting[] greeting = {new GoodMorning("A"),new GoodMorning("B"),new GoodMorning("C")};

    	// 挨拶表示
    	for(int i = 0;i < greeting.length;i++) {
    		greeting[i].showGreeting();
    	}
    }
}
Greeting.java
package Test1;
public abstract class Greeting {
	// インスタンス変数
	private String name;

	// コンストラクタ
	public Greeting(String name) {
		this.name = name;
	}
	// getter
	public String getName() {
		return name;
	}
	// 挨拶の表示
	abstract void showGreeting();
}
GoodMorning.java
package Test1;
public class GoodMorning extends Greeting {
	// コンストラクタ
	public GoodMorning(String name) {
		super(name);
	}
	// 挨拶の表示
	@Override
	void showGreeting() {
		System.out.println(getName()+"さん、おはようございます。");
	}
}
  • 上記の文をコピーして、文字コードは S-JIS を指定し、ファイル名を Test1.java , Greeting.java , GoodMorning.java で保存し、実行するとこうなります。↓↓                          
    07.png

7.ポリモーフィズムをする理由

  • オブジェクト指向 では、 あらゆる事象オブジェクト として捉える。
  • そのため、 オブジェクトの数 に比例して インスタンス化するクラスの数 も増加する。
  • オブジェクトの数だけコードを書く と考えると途方もない数字となり書き切ることは難しい。
  • ポリモーフィズム は、オブジェクト同士の共通点を見つけ、抽象化することで コードの簡略化コードの書く量を減らしている

A,B,Cの3人がそれぞれ挨拶をするシステム

  • A,B,Cが順番に挨拶をする。
  • 挨拶は「おはようございます」,「こんにちは」,「こんばんは」の3種類。
  • 上記のようなシステムを作る際に ポリモーフィズム をしなかった場合、下記のコードようにコード量が増えて複雑化してしまう。
Test1.java
package Test1;
public class Test1 {
    public static void main(String[] args) {
        // インスタンスの生成
    	GoodMorning[] goodmorning = {new GoodMorning("A"),new GoodMorning("B"),new GoodMorning("C")};
    	Hello[] hello = {new Hello("A"),new Hello("B"),new Hello("C")};
    	GoodEvening[] goodevening = {new GoodEvening("A"),new GoodEvening("B"),new GoodEvening("C")};

    	// 挨拶表示
    	for(int i = 0;i < goodmorning.length;i++) {
    		goodmorning[i].showGreeting();
    	}
    	for(int i = 0;i < hello.length;i++) {
    		hello[i].showGreeting();
    	}
    	for(int i = 0;i < goodevening.length;i++) {
    		goodevening[i].showGreeting();
    	}
    }
}
Hello.java
package Test1;
public class Hello {
	// インスタンス変数
	String name;

	// コンストラクタ
	public Hello(String name) {
		this.name = name;
	}
	// 挨拶の表示
	void showGreeting() {
		System.out.println(name+"さん、こんにちは。");
	}
}
GoodMorning.java
package Test1;
public class GoodMorning{
	// インスタンス変数
	String name;

	// コンストラクタ
	public GoodMorning(String name) {
		this.name = name;
	}
	// 挨拶の表示
	void showGreeting() {
		System.out.println(name+"さん、おはようございます。");
	}
}
GoodEvening.java
package Test1;
public class GoodEvening {
	// インスタンス変数
	String name;

	// コンストラクタ
	public GoodEvening(String name) {
		this.name = name;
	}
	// 挨拶の表示
	void showGreeting() {
		System.out.println(name+"さん、こんばんは。");
	}
}
  • 上記の文をコピーして、文字コードは S-JIS を指定し、ファイル名を Test1.java , GoodMorning.java , Hello.java , GoodEvening.java で保存し、実行するとこうなります。↓↓                          
    06.png

  • 上記の例では、 ポリモーフィズムを使用していない ため、 配列が3つ 存在し、それに対応した for文 が存在する。

  • ポリモーフィズム を使用して 抽象化 することで 配列を1つ にまとめることができる。

  • 上記の例の GoodMorning.java , Hello.java , GoodEvening.java抽象化 すると以下のようになる。

Test1.java
package Test1;
public class Test1 {
    public static void main(String[] args) {
        // インスタンスの生成
    	Greeting[] greeting = {
    			new GoodMorning("A"),new GoodMorning("B"),new GoodMorning("C"),
    			new Hello("A"),new Hello("B"),new Hello("C"),
    			new GoodEvening("A"),new GoodEvening("B"),new GoodEvening("C")
    			};

    	// 挨拶表示
    	for(int i = 0;i < greeting.length;i++) {
    		greeting[i].showGreeting();
    	}
    }
}
Greeting.java
package Test1;
public abstract class Greeting {
	// インスタンス変数
	private String name;

	// コンストラクタ
	public Greeting(String name) {
		this.name = name;
	}
	// getter
	public String getName() {
		return name;
	}
	// 挨拶の表示
	abstract void showGreeting();
}
Hello.java
package Test1;
public class Hello extends Greeting{
	// コンストラクタ
	public Hello(String name) {
		super(name);
	}
	// 挨拶の表示
	@Override
	void showGreeting() {
		System.out.println(getName()+"さん、こんにちは。");
	}
}
GoodMorning.java
package Test1;
public class GoodMorning extends Greeting {
	// コンストラクタ
	public GoodMorning(String name) {
		super(name);
	}
	// 挨拶の表示
	@Override
	void showGreeting() {
		System.out.println(getName()+"さん、おはようございます。");
	}
}
GoodEvening.java
package Test1;
public class GoodEvening extends Greeting {
	// コンストラクタ
	public GoodEvening(String name) {
		super(name);
	}
	// 挨拶の表示
	@Override
	void showGreeting() {
		System.out.println(getName()+"さん、こんばんは。");
	}
}
  • 上記の文をコピーして、文字コードは S-JIS を指定し、ファイル名を Test1.java , Greeting.java , GoodMorning.java , Hello.java , GoodEvening.java で保存し、実行するとこうなります。↓↓                          
    06.png

7.GitHub

GitHubにソースコードを公開しています。

8.関連

9
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?