【Java】ポリモーフィズム

f:id:nowa0402:20210613094057p:plain
こんにちは。のわです。
今回はポリモーフィズムについて整理したいと思います。

 ポリモーフィズムは『多態性』のこと
 ・フィールドは宣言する変数の型が採用される
 ・インスタンスを扱っている『型』によって、呼び出せるメソッドが決まる

実際のコードで確認してみます。
今回のコードは以下の構成です
 ・親クラス:Parent
 ・子クラス:Child
 ・呼び出し:Main

【Parentクラス】

public class Parent {
    int i;
    
    public void test() {
        System.out.println("親");
    }
}

【Childクラス】

public class Child extends Parent{
    int i = 10;
    
    public void test() {
        System.out.println("子");
    }
    
    public void test(String str) {
        System.out.println(str);
    }
    
}


ChildクラスはParentクラスを継承しています。
Childクラスには以下の特徴があります
 ・int i =10を定義している
 ・testメソッドをオーバーライド、オーバーロードしている

このクラスを呼び出すMainクラスのコードが下記になります。

【Mainクラス】

public class Main {
	public static void main(String[] args) {
	 Parent a = new Child();
	 
	 a.test(); //①
	 
	 System.out.println(a.i); //②
	}
}

Mainクラスの処理は以下のとおりです。
 ・Childクラスのインスタンスであり、Parent型の変数aを宣言(多態性の利用)
 ・test()メソッドを実行
 ・フィールドiの値を出力

このとき、結果はどうなるか

 多態性の特徴として
  ・メソッドは変数の型に定義されているものしか呼び出せない
  ・メソッドがサブクラスでオーバーライドされている場合、サブクラスのメソッドが呼び出される
  ・フィールドは宣言した変数のクラスのものが使用される

 があげられます。




①test()メソッドの呼び出し
 test()メソッドは以下のような状況です
  ・Parentクラスで定義されている
  ・子クラスである、Childクラスでオーバーライドしている

 このことから、呼び出されるのはサブクラスのtest()メソッドになります
 つまり、出力結果は『子』です。

②フィールドiの値を出力
 フィールドiは以下のような状況です
  ・Parentクラスで宣言している
  ・子クラスである、Childクラスで同一名のフィールドを宣言している

 このとき、フィールドは変数宣言で使用されているクラスのものが使用されます。
 今回の変数aはParentクラスで宣言しています。
 そのため、フィールド値はParentクラスが使用されます
 つまり、出力結果は『0』です。



次にMainクラスにコードを書き加えます。

【Mainクラス】

public class Main {
	public static void main(String[] args) {
	 Parent a = new Child();
	 
	 a.test(); //①
	 
	 System.out.println(a.i); //②

   a.test("A"); //③
	}
}

新たに③が追加されました
③test(String str)メソッドの呼び出し
 ③のコードではString型の引数を指定しています。
 このとき
  ・Childクラスでtest(String str)メソッドをオーバーロードして定義している
  ・親クラスのParentクラスでは定義していない

 という状態です。
 変数aの型はParent型です。
 親クラスで定義されていないメソッドやフィールドは呼び出すことができません。
 つまり、このコードはコンパイルエラーとなります。





今回はポリモーフィズム多態性)についてまとめました。
JavaSilverの勉強をしていると、幾度となくこういった問題に遭遇します。
頭の整理を兼ねてまとめてみました。

今回も最後まで読んでいただきありがとうございました!