見出し画像

Javaの学習:ポリモーフィズム 「継承」と「インターフェイス」

こんにちは、やまもとです。
(今回の記事を書いているのは深夜です。)

私のJavaの学習方法は会社で研修を受けながら、休みの時間でより詳しく学習するというスタイルでやっております。
研修の内容を社外に持ち出すのはもちろん厳禁です。
ですので、休みの時間での学習のメインは、わからないことを調べてやり方を理解し、こういうプログラムを作りたかったらどういう風になるのだろう?と考えながら自分でプログラムを書いていきます。
記事中に自作のコードを掲載していますので、学習の際に使用していただければと思います。
また、内容に対しての指摘・アドバイスがございましたら記事のコメントやTwitterで教えていただけますと幸いです。
質問も大歓迎です。
その際に参考にしたサイトは記事の最後にまとめて記載しております。
以上前置きです。(全記事共通)

--------------------------------------------------------------------------------------

本日は、ポリモーフィズムというものを学習してみました。
私自身いくつかのプログラミング言語は学習したことがあるものの実践の中で必要な知識を必要なだけ学ぶというスタイルで学習していましたので、ポリモーフィズムという言葉すら初めて聞きました。
(私が学習してきたプログラミング言語に関してはプロフィール欄を参照ください。)

<ポリモーフィズム>
ポリモーフィズム(英: Polymorphism)とは、プログラミング言語の型システムの性質を表すもので、プログラミング言語の各要素(定数、変数、式、オブジェクト、関数、メソッドなど)についてそれらが複数の型に属することを許すという性質を指す。ポリモルフィズム、多態性、多相性、多様性とも呼ばれる。対義語はモノモーフィズム (Monomorphism)、単態性、単相性で、プログラミング言語の各要素が唯一つの型に属するという性質を指す
出典: フリー百科事典『ウィキペディア(Wikipedia)』

作成したプログラムは、継承・抽象クラスという技術を利用しました。
どういったことができるプログラムを作ったかといいますと、
実行すると、入力を求められる。入力された単語に応じて異なる表示を出す。というものです。

具体的に説明します。
イメージは食事・餌やりです。
シェフはお客様の情報を聞いてきます。
そこで(人間or犬)を入力します。
人間であれば「ぱくぱく」
犬であれば「がぶがぶ」
という返事が返ってきます。

調べた内容はプログラムを紹介する際に、まとめています。

--------------------------------------------------------------------------------------

今回は6つのプログラム(同一パッケージ)を作成しています。
(目次と対応しています。)

・main.java(実行するプログラム)
 〇文字列の比較についての紹介

・sub.java(サブルーチン集)
 〇文字の読み込みについて紹介

・Animal.java(抽象クラス)

・Human.java(人の動作:Animalクラスをスーパークラスとするサブクラス)

・Dog.java(犬の動作:Animalクラスをスーパークラスとするサブクラス

・Server.java(シェフの動作)

--------------------------------------------------------------------------------------

・main.java

public class main { 

	public static void main(String[] args) {
		Server server =  new Server();
        // お客様情報を聞き出す。
		server.serve(); 
        // お客様が人間だった場合の振る舞いをする
		if(server.eater.equals("human")){
			Human human = new Human();
            // サブクラスの参照変数をスーパークラスの参照変数に代入する
			Animal animal = human;
			animal.eat();
		}

		if(server.eater.equals("dog")) {
			Dog dog = new Dog();
            // サブクラスの参照変数をスーパークラスの参照変数に代入する
			Animal animal = dog;
			animal.eat();
		}
	}

}

実行プログラム(最後に読む方が理解し易いかもしれません。) 
コード内に説明を入れてますので、適宜確認してください。

〇文字列の比較についての紹介

Javaで文字列を比較するときは『==』ではダメみたいです。
では、どうしたらいいのでしょうか?
そこで使用するのが『equalsメソッド』です。
使い方は簡単です。
例えばABCという変数と123という変数が一緒かどうか確認したいときはこうなります。

ABC.equals(123)

--------------------------------------------------------------------------------------

・sub.java

// scanをするために必要
import java.util.Scanner;

public class sub {
	
    // 入力された文字(String型)を読み込む
	public String scan(){
	    Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();
        scan.close();
        return str;
	}
	
    // 文字(String型)を出力する
	public void println(String str){
		System.out.println(str);
	}

    // プログラムを終了させる
	public void exit() {
		System.exit(0);
	}

}

サブルーチン集
今回は、文字の読み込み・文字の出力・プログラムの終了の3つです。

〇文字の読み込みについて紹介

インポートしたjava.util.Scannerクラスは、一行分の入力を取得するnextLineメソッドがあります。(それ以外にも空白までを読み込むものや数値を読み込むものもあります。)

import java.util.Scanner;

public class ScanAndPrint{
   public static void main(String[] args) {
       Scanner scan = new Scanner(System.in);
       String str = scan.nextLine();
       System.out.println(str);
       scan.close();
   }

例えばこれを実行してみましょう。
その際、『Hello!』と入力してみましょう。

Hello!

と入力した結果が返ってくると思います。

--------------------------------------------------------------------------------------

・Animal.java

// 抽象クラス
public abstract class Animal{
    // 抽象メソッドを定義する
	public abstract void eat();
}

--------------------------------------------------------------------------------------

・Human.java

// Animalクラスを継承したサブクラス
public class Human extends Animal{

    // 人の動作を表示する
	public void eat(){
		sub sb = new sub();
		sb.println("人に食事を提供した");
		sb.println( "人「ぱくぱく」" );
	}

}

--------------------------------------------------------------------------------------

・Dog.java

// Animalクラスを継承したサブクラス
public class Dog extends Animal{

    // 犬の動作を表示する
	public void eat(){
		sub sb = new sub();
		sb.println("犬に餌をあげた");
		sb.println("犬「がぶがぶ」");
	}

}

--------------------------------------------------------------------------------------

・Server.java

public class Server {

    // 入力された文字(String型)を戻り値にする
	public String eater;

    // シェフの動作を表示する
	public String serve() {
		sub sb = new sub();
		sb.println("シェフ「お客様の情報を教えてください。」");
		sb.println("注意:humanかdogを入力してください。");
		eater = sb.scan();
		sb.println(eater + "が入力されました。");

        // 人(human)または犬(dog)が入力されたときに実行
		if(eater.equals("human") || eater.equals("dog")){
			sb.println("「どうぞ!」");
		}

        // 人(human)、犬(dog)以外が入力されたときに実行
		else{
			sb.println("humanかdogを入力してください。");
			sb.println("プログラムを終了します。");
			sb.exit();
		}

		return eater;
	}

}

--------------------------------------------------------------------------------------

・実行結果

(1)humanと入力したとき

画像1

(2)dogと入力したとき

画像2

(3)inuと入力したとき

画像3

思った通りの結果になりました。

Javaでの一致の確認がString型だと『==』では、思った結果が得れないと知らず、手間取りました。
あとは、文字を読み込んだ後にどうやってクラス間でやり取りするのか、Object関数に変換するためにはなど試行錯誤しながら作成してました。

【Twitter】
定期的につぶやいています。
記事の更新もつぶやいています。
フォローよろしくお願いします。

--------------------------------------------------------------------------------------

参考サイト


この記事が気に入ったらサポートをしてみませんか?