Help us understand the problem. What is going on with this article?

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

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
8. 3と同様の手順でパッケージに Test1 、名前に GoodMorning 、スーパークラスに Test1.Greeting と入力し、 完了 ボタンをクリックする。
03.png
9. 3と同様の手順でパッケージに Test1 、名前に Hello 、スーパークラスに Test1.Greeting と入力し、 完了 ボタンをクリックする。
04.png
10. 3と同様の手順でパッケージに Test1 、名前に GoodEvening 、スーパークラスに Test1.Greeting と入力し、 完了 ボタンをクリックする。
05.png
11. 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();
}
Greeting.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.関連

ryome
主にプログラミングや環境構築について解説していきます。
https://ryomeblog.wixsite.com/tech
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした