Vererbung

Einer der wichtigsten Aspekte in der OOP ist die Möglichkeit, dass eine Klasse von genau einer anderen Klasse erben kann. Dadurch übernimmt sie alle Eigenschaften und Methoden, kann aber um neue Funktionalitäten erweitert werden. Dazu erst einmal eine Basisklasse:


  class Fahrzeug {

    protected double maxSpeed;
    protected double curSpeed;
    protected Color color;

    public Fahrzeug(double ms, Color c) {
      maxSpeed = ms;
      curSpeed = 0;
      color = c;
    }

    public Color getColor() {
      return color;
    }

    public double getSpeed() {
      return curSpeeed;
    }

    public void beschleunigen() {
      curSpeed += 20;
      if (curSpeed > maxSpeed) {
        curSpeed = maxSpeed;
      }
    }

    public void bremsen() {
      curSpeed -= 20;
      if (curSpeed < 0) {
        curSpeed = 0;
      }
    }

    public boolean istSchnellerAls(Fahrzeug f) {
      return curSpeed > f.curSpeed;
    }

  }

Instanzen dieser Klasse repräsentieren ein Fahrzeug mit einer Farbe und einer aktuellen bzw. Höchstgeschwindigkeit. Durch die Datenkapselung wird sichergestellt, dass die Farbe geändert wird. Auch die Geschwindigkeit kann nicht direkt, sondern nur durch beschleunigen() und bremsen() beeinflusst werden.


  class Cabriolet extends Fahrzeug {

    protected boolean verdeckOffen;

    public Cabriolet() {
      super(180, Color.red);
      verdeckOffen = false;
    }

    public void umspritzen(Color c) {
      color = c;
    }

    public void oeffneVerdeck() {
      if (curSpeed < 50) {
        verdeckOffen = true;
      }
    }

    public void schliesseVerdeck() {
      if (curSpeed < 50) {
        verdeckOffen = false;
      }
    }

  }

Mit extends wird angegeben, dass Cabriolet von der Klasse Fahrzeug erbt. Die Klasse von der geerbt wird bezeichnet man als Super-Klasse. Durch die Vererbung enthält die Klasse automatisch alle Eigenschaften und Methoden der Super-Klasse Fahrzeug. Da die Eigenschaften in Fahrzeug alle protected sind, kann die Klasse Cabriolet direkt darauf zugreifen (Erläuterung der Zugriffsrechte in Lektion B2).

Im Konstruktor muss als erste Anweisung der Konstruktor der Super-Klasse aufgerufen werden. Dazu wird nicht der Name der Klasse Fahrzeug(...) verwendet, sondern das Schlüsselwort super(...).


  Fahrzeug f = new Fahrzeug(200, Color.blue);
  Cabriolet c = new Cabriolet();

  c.umspritzen(Color.green);

  f.beschleunigen();
  c.beschleinigen();
  c.beschleinigen();

  System.out.println("f faehrt " + f.getSpeed());  // ergibt 20
  System.out.println("c faehrt " + c.getSpeed());  // ergibt 40
  System.out.println("c ist schneller als f? "
      + c.istSchnellerAls(f));                     // ergibt true

Abschliessend sei noch erwähnt, dass auch die Klasse Fahrzeug von einer anderen Klasse ärbt. Klassendeklarationen ohne extends erben automatisch von der Klasse Object. Dadurch stammen alle Klassen direkt oder indirekt von dieser Klasse ab. Man kann damit alle Instanzen von beliebigen Klassen nach Object casten. Auch erben alle Klassen sämtliche Methoden der Klasse Object. Dazu später mehr.


Erstellt von Markus Durzinsky, aktualisiert 2004-03-29
Für Fragen, Probleme oder Anregungen stehe ich gerne zur Verfügung