Laufzeit-Polymorphismus in Java ohne "abstrakt"?

Ich habe das offizielle Oracle-Tutorial durchgesehen, in dem die Idee des Polymorphismus am Beispiel einer Klassenhierarchie mit drei Klassen vorgestellt wird. Fahrrad ist die Superklasse und MountainBike und RoadBike sind 2 Unterklassen.

Es wird gezeigt, wie die beiden Unterklassen eine in Bicycle deklarierte Methode "printDescription" überschreiben, indem verschiedene Versionen davon deklariert werden.

Zum Schluss wird im Lernprogramm erwähnt, dass die Java Virtual Machine (JVM) die entsprechende Methode für das Objekt aufruft, auf das in jeder Variablen verwiesen wird.

Aber nirgends wird im Tutorial zum Polymorphismus das Konzept der "abstrakten" Klassen und Methoden erwähnt. Wie wird Laufzeit-Polymorphismus erreicht, wenn printDescription () in Bicycle nicht als "abstrakt" deklariert ist? Ich meine, in diesem Beispiel basierend auf welchen Hinweisen entscheidet der Compiler, Methodenaufrufe zur Kompilierungszeit nicht an den Referenztyp zu binden, und denke, dass es der JVM überlassen bleiben sollte, diese zur Laufzeit zu verarbeiten?

Unten sehen Sie das Beispiel:

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();
      }
}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage