04.09 Abstrakte Klassen

Sie wissen mittlerweile sehr viel über Klassen, Vererbung und Interfaces. In diesen Kontext reiht sich heute für Sie ein weiterer Begriff: Abstrakte Klassen.

Abstrakte Kassen sind eine Mischung aus Elternklassen und Interfaces. Ähnlich wie bei einem Interface, können leere (abstrakte) Methoden in einer abstrakten Klasse erstellt werden. Diese werden mit dem Schlüsselwort abstract gekennzeichnet. Mit selbigem Modifizierer muss auch die dazugehörige Klasse versehen werden.

package de.abstr;
public abstract class AbstractTest {
  public abstract void doSomething();
}

Eine Klasse, die von AbstractTest erbt, muss immer die Methode doSomething() überschreiben. Ein neues Objekt unserer abstrakten Klasse kann deshalb nicht wie gewöhnlich erstellt werden, da die abstrakte Methode auf diesen Weg nicht überschrieben wurde.

Im Gegensatz zu Interfaces, besteht bei abstrakten Klassen die Möglichkeit nicht nur zu überschreibende Methoden zu erstellen, sondern auch die Klasse ansonsten wie eine ganz gewöhnliche Klasse aufzubauen:

package de.abstr;
public abstract class AbstractTest {
o
  protected String aValue = null;
o
  public AbstractTest() {
    this("default");
  }
o
  public AbstractTest(String aValue) {
    setAValue(aValue);
  }
o
  public void setAValue(String aValue) {
    this.aValue = aValue;
  }
o
  public String getAValue() {
    return aValue;
  }
o
  public abstract void doSomething();
}

Unsere abstrakte Klasse kann auch in „gewöhnlichen“ Methoden ganz normal ihre eigenen abstrakten Methoden aufrufen – diese müssen ja zur Laufzeit implementiert sein!

...
abstract int calc(int i, int j);
...
public int foobar()  {
  return calc(5, 9) * 3;
}
...

Dies ist der Vorteil gegenüber Interfaces. Der Nachteil liegt darin, dass es eben auch Klassen sind. Dadurch kann in Java, aufgrund der fehlenden Mehrfachvererbung, auch nur von einer (abstrakten) Klasse geerbt werden. Es gilt also je nach Situation abzuwägen, ob es sinnvoller ist eine Schnittstelle in Form eines Interfaces zu implementieren, oder stattdessen eine abstrakte Klasse zu verwenden.

Beachten Sie, dass eine abstrakte Methode natürlich nie private sein kann, da sie sonst von keiner anderen Klasse implementiert werden kann.

Ähnliche Beiträge