Полиморфизм во время выполнения в Java без «абстрактного»?

Я просматривал официальное руководство по Oracle, где оно вводит идею полиморфизма на примере иерархии классов из 3 классов; Bicycle - суперкласс, а MountainBike и RoadBike - 2 подкласса.

Он показывает, как 2 подкласса переопределяют метод & quot; printDescription & quot; объявлено в Bicycle, объявив разные версии этого.

И, наконец, в конце учебника упоминается, что виртуальная машина Java (JVM) вызывает соответствующий метод для объекта, на который ссылается каждая переменная.

Но нигде в учебнике по полиморфизму не упоминается концепция «абстрактного». классы и методы. Как достигается полиморфизм во время выполнения, если printDescription () в Bicycle не объявлен как «абстрактный»? Я имею в виду, учитывая данный пример, основываясь на каких подсказках компилятор решает не связывать вызов метода со ссылочным типом во время компиляции и думает, что ему следует оставить это для 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();
      }
}

Ответы на вопрос(6)

Ваш ответ на вопрос