042-抽象クラス-オーバーライドとポリモーフィズム 【新人エンジニアが最初に覚えたい100のJava文法】

ユーチューブ動画

オーバーライドとポリモーフィズムについて解説します。

ソースコード

abstract class Product {
	private String productName;
	private int price;
	public Product(String productName, int price) {
		this.productName = productName;
		this.price = price;
	}
	public abstract void showData();
}
class Printer extends Product {
	private int printSpeed;
	public Printer(String productName, int price, int printSpeed) {
		super(productName, price);
		this.printSpeed = printSpeed;
	}
	public void showData() {
		System.out.println(this.printSpeed);
	}
}
class Computer extends Product {
	private double clockFeq;
	public Computer(String productName, int price, double clockFeq) {
		super(productName, price);
		this.clockFeq = clockFeq;
	}
	public void showData() {
		System.out.println(this.clockFeq);
	}
}

解説

オーバーライドとポリモーフィズムについて解説します。

以前の動画(041-抽象クラス-抽象クラスの定義)で抽象クラスや抽象メソッドについて、解説しました。

抽象クラスでは、抽象メソッドを定義することができます。

抽象メソッドを定義すると、サブクラス側にオーバーライドすることを強制することができます

オーバーライドについて、以前の動画でも紹介しましたが、決まりは覚えていますか?

そう、戻り値の型、メソッドの名前、引数リストを同じものにして、再定義することでした。

再定義することで、処理を上書きすることができます。

では、処理を上書きすることで、どのようなメリットができるのでしょうか。

PrinterクラスのshowDataメソッドでは、printSpeedを表示して、

ComputerクラスのshowDataメソッドでは、周波数を表示するように、メソッドをオーバーライドしています。

オーバーライドして、別々の処理になったわけです。

それらのメソッドを利用しているmainメソッドの処理に注目してください。

お互い違うクラスのインスタンスですが、

スーパークラスのデータ型の変数に代入することができています。

ここがポイントです。

サブクラスのインスタンスは、スーパークラスの変数に代入できるということです。

スーパークラスの変数に代入されたインスタンスからは、サブクラスに共通のメソッド、

ここでは抽象メソッドを呼び出すことができるようになります。

すると、同じメソッド名でもこの2行は違う動作になります。

片方は、プリントスピード、もう片方は、周波数です。

このように、同じメソッドでも異なる振る舞いを実行できる性質をポリモーフィズムといいます

まだ、このサンプルだけでは、ポリモーフィズムのメリットを生み出していません。

さらにどんなメリットが生まれるのかについては、ぜひ、次の動画を参照ください。

この段階では、オーバーライドとポリモーフィズムはセットになっていると覚えておくとよいでしょう。

以上、オーバーライドとポリモーフィズムについて解説しました。

このサンプルコードをJavaタッチタイプゲームとして遊ぶことができます。