2019.04.19
「ポリモーフィズム」は、「多様性」や「多態性」などといわれ、カプセル化、継承に続くオブジェクト指向の三大要素の一つです。
変数の型は同じでも、オブジェクトの中身によって、メソッドの機能が異なることをポリモーフィズムと呼びます。
メソッドの呼び出し方法を共通にして、その上にオーバーライドした同じメソッドを呼び出した場合、インスタンスごとに違う動きをします。型が異なる変数をどのように代入しても、呼び出すオーバーライドメソッドは変わらない、オーバーライドの性質を利用しています。
文字ばかりでは難しいので、下記のポリモーフィズムを使ったサンプルと、使わなかったサンプルを見てみましょう。両方とも実行結果は同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | //車クラス class Car { int speed; String name; public Car(String name, int speed) { this.name = name; this.speed = speed; } public void drive() { System.out.println(name + "は時速" + speed + "キロで走ります"); } } //新幹線クラス class Shinkansen { int speed; String name; public Shinkansen(String name, int speed) { this.name = name; this.speed = speed; } public void drive() { System.out.println(name + "は時速" + speed + "キロで走ります"); } } public class Sample { public static void main(String[] args) { Car c = new Car("自動車", 80); Shinkansen s = new Shinkansen("新幹線", 300); c.drive(); s.drive(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | //乗り物クラス(抽象クラス) abstract class Norimono { String name; int speed; public Norimono(String name, int speed) { this.name = name; this.speed = speed; } //抽象メソッド abstract public void drive(); } //乗り物クラスを継承した車クラス class Car extends Norimono { public Car(String name, int speed) { super(name, speed); } @Override public void drive() { System.out.println(name + "は時速" + speed + "キロで走ります"); } } //乗り物クラスを継承した新幹線クラス class Shinkansen extends Norimono { public Shinkansen(String name, int speed) { super(name, speed); } @Override public void drive() { System.out.println(name + "は時速" + speed + "キロで走ります"); } } public class Sample { public static void main(String[] args) { Norimono c = new Car("車", 80); Norimono s = new Shinkansen("新幹線", 300); c.drive(); s.drive(); } } |
実行結果(両方同じ)
1 2 | 車は時速80キロで走ります 新幹線は時速300キロで走ります |
ポリモーフィズムをありのサンプルは、引数を受け取ったインスタンスが、子クラスによって違う振る舞いをしていますね。
drive()という命令が実行されれば、受け取ったインスタンスが車であれば時速80キロで走り、新幹線であれば300キロで走ります。
船やヘリコプターといった陸路で走らない乗り物が増えようとも、Norimonoの型を持つインスタンスにdrive()を使えば、どのような乗り物でも走ることができます。
2行目と11行目にabstractキーワードを付けて、抽象クラスと抽象メソッドを指定してます。継承したサブクラスが正確にオーバーライドしないとコンパイルエラーになるの注意です。
ちなみにabstractキーワードを付けないと、サブクラスがどこからオーバーライドしたらいいか識別できなくなりコンパイルエラーになります。
親クラスにメソッドを宣言しておいて、子クラスでメソッドに対応した処理をすれば、それぞれのサブクラスを使用する際に、一つのメソッドだけを覚えれば済みますね。