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 {
	
  protected String aValue = null;
	
  public AbstractTest() {
    this("default");
  }
	
  public AbstractTest(String aValue) {
    setAValue(aValue);
  }
	
  public void setAValue(String aValue) {
    this.aValue = aValue;
  }
	
  public String getAValue() {
    return aValue;
  }
	
  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.

2 Replies to “04.09 Abstrakte Klassen”

  1. Gast

    So wie ich die Erklärung verstanden habe, hat die Abstrakte-Klasse die Aufgabe, eine Struktur und eine mögliche Implementierung vorzugeben.

    Der Unterschied zu Interface besteht darin, dass ein Interface keine mögliche Implementierung vorschlagen kann aber dafür die Mehrfachvererbung unterstützt.

    Korrekt ?

  2. Stefan Kiesel

    Ja, das kann man so sagen. In der Praxis werden die Interfaces aber meistens den abstrakten Klassen vorgezogen. Ein Gefühl dafür, was man wann verwendet, bekommt man am Besten beim praktischen Einsatz dieser beiden Varianten.

    Gruß
    Stefan

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.