私は、公式の Oracle チュートリアルを調べていました。ここでは、3 つのクラスのクラス階層の例を使用してポリモーフィズムの概念を紹介しています。Bicycle がスーパークラスで、MountainBike と RoadBike が 2 つのサブクラスです。
2 つのサブクラスが、Bicycle で宣言されたメソッド「printDescription」を、異なるバージョンを宣言することによってオーバーライドする方法を示しています。
そして最後に、このチュートリアルでは、Java 仮想マシン (JVM) が、各変数で参照されるオブジェクトの適切なメソッドを呼び出すことに言及しています。
しかし、ポリモーフィズムに関するチュートリアルでは、「抽象」クラスとメソッドの概念についてはどこにも言及されていません。BicycleのprintDescription()が「抽象的」と宣言されていない限り、実行時のポリモーフィズムはどのように達成されますか? つまり、この例を考えると、どのようなヒントに基づいて、コンパイラーはコンパイル時にメソッド呼び出しを参照型にバインドしないことを決定し、JVM が実行時に処理できるようにする必要があると考えているのでしょうか?
以下は使用例です。
public class Bicycle {
public int cadence;
public int gear;
public int speed;
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
public void setCadence(int newValue) {
cadence = newValue;
}
public void setGear(int newValue) {
gear = newValue;
}
public void applyBrake(int decrement) {
speed -= decrement;
}
public void speedUp(int increment) {
speed += increment;
}
public void printDescription(){
System.out.println("\nBike is " + "in gear " + this.gear
+ " with a cadence of " + this.cadence +
" and travelling at a speed of " + this.speed + ". ");
}
}
public class MountainBike extends Bicycle {
private String suspension;
public MountainBike(
int startCadence,
int startSpeed,
int startGear,
String suspensionType){
super(startCadence,
startSpeed,
startGear);
this.setSuspension(suspensionType);
}
public String getSuspension(){
return this.suspension;
}
public void setSuspension(String suspensionType) {
this.suspension = suspensionType;
}
public void printDescription() {
super.printDescription();
System.out.println("The " + "MountainBike has a" +
getSuspension() + " suspension.");
}
}
public class RoadBike extends Bicycle{
private int tireWidth;
public RoadBike(int startCadence,
int startSpeed,
int startGear,
int newTireWidth){
super(startCadence,
startSpeed,
startGear);
this.setTireWidth(newTireWidth);
}
public int getTireWidth(){
return this.tireWidth;
}
public void setTireWidth(int newTireWidth){
this.tireWidth = newTireWidth;
}
public void printDescription(){
super.printDescription();
System.out.println("The RoadBike"
" has " + getTireWidth() +
" MM tires.");
}
}
public class TestBikes {
public static void main(String[] args){
Bicycle bike01, bike02, bike03;
bike01 = new Bicycle(20, 10, 1);
bike02 = new MountainBike(20, 10, 5, "Dual");
bike03 = new RoadBike(40, 20, 8, 23);
bike01.printDescription();
bike02.printDescription();
bike03.printDescription();
}
}