【Java】ポリモーフィズム
こんにちは。のわです。
今回はポリモーフィズムについて整理したいと思います。
・ポリモーフィズムは『多態性』のこと
・フィールドは宣言する変数の型が採用される
・インスタンスを扱っている『型』によって、呼び出せるメソッドが決まる
実際のコードで確認してみます。
今回のコードは以下の構成です
・親クラス: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の勉強をしていると、幾度となくこういった問題に遭遇します。
頭の整理を兼ねてまとめてみました。
今回も最後まで読んでいただきありがとうございました!