Advanced Java Services | Abstrakte Klassen |
Eine abstrakte Klasse ist eine Klasse, von der man keine Objekte anlegen kann. Wozu braucht man eine
Klasse, von der man keine Objekte anlegen kann ? Das scheint auf den ersten Blick ziemlich sinnlos.
Auf den zweiten Blick jedoch durchaus nicht. Wenn man an einem Projekt arbeitet, wird man sehr
schnell zu dem Punkt kommen, wo man verschiedene Klassen entwirft, die sich aus dem gestellten Problem
ergeben. Man wird versuchen, sie in eine sinnvolle Vererbungshierarchie zu bringen und hat dann recht
bald ein halbes Dutzend oder auch mehr Klassen zusammengestellt. Man wird Methoden in verschiedenen
Klassen, die sinngemäß ähnliche Aufgaben haben, mit dem gleichen Namen versehen und dann mehr oder
weniger automatisch zu der Idee gelangen, diese Methoden weit oben in der Hierarchie anzulegen.
Die tieferliegenden Klassen werden sie dann erben und bei Bedarf überschreiben, d.h. ihren Bedürfnissen
entsprechend anpassen. Nur ein Schritt weiter ist die Idee, diese Methoden verpflichtend zu machen,
so daß man als Anwender der Klassenhierarchie einfach sicher sein kann, daß diese Methoden in allen
abgeleiteten Klassen existieren. Ähnlich kann man mit den Eigenschaften einer Klasse verfahren.
So kommt man zu der Idee, eine Klasse zu schaffen, die sozusagen für das Design der ganzen Hierarchie
zuständig ist. Von einer solchen Klasse braucht man nicht unbedingt Objekte, sie ist "nur" dafür da,
eine Klassenhierarchie konsistent zu gestalten. Aus diesem Grund hat man den Begriff der abstrakten
Klasse eingeführt. Meistens liegen abstrakte Klassen sehr weit oben in der Hierarchie.
Wie man an dem folgenden Beispiel reicht alleine der modifier abstract aus, um eine Klasse abstrakt
zu machen. Man kann nun keine Objekte mit dem Konstruktor anlegen.
// ------------------------ Datei Abstract.java ------------------------ \\ public abstract class Abstract { int a ; public Abstract() { } public void nichtAbstract() { } } // ---------------------- Datei TestAbstract.java ---------------------- \\ public class TestAbstract { public static void main(String args[]) { Abstract abs; // das geht // abs = new Abstract(); // das geht nicht // compiletime error: // Abstract is abstract; cannot be instantiated abs = new Abstract(); } }
Im obigen Fall verbietet der Entwickler explizit das instantiieren von Objekten dieser Klasse. Würde er das Wort abstract weglassen, so könnte man von dieser Klasse problemlos Objekte anlegen.
Etwas häufiger ist der Fall, daß man eine Klasse abstrakt machen muß. Neben dem Begriff abstrakte Klasse gibt es nämlich auch noch dem Begriff der abstrakten Methode. Eine abstrakte Methode ist eine Methode ohne Rumpf, also ohne Implementierung. Das folgende Beispiel enthält eine abstrakte und eine nicht abstrakte Methode.
public class Abstract2 // hier fehlt der modifier abstract => compiletime error { public void nichtAbstract() { } public abstract void schonAbstract() ; // Semikolon nicht vergessen !! }
Enthält eine Klasse (mindestens) eine abstrakte Methode, dann muß auch die Klasse abstract sein.
Leitet man eine Klasse ab, die abstrakte Methoden enthält, dann ist die abgeleitete Klasse selbst
wieder abstrakt. Sie kann allerdings real werden, wenn man (sämtliche) geerbten abstrakten Methoden
implementiert. Leitet man dagegen von einer abstrakten Klasse ab, die keine abstrakten Methoden
enthält, dann ist diese Ableitung automatisch real. Die letzte Situation ist nicht so abwegig,
wie man vermuten möchte. Schauen sie sich die Klasse java.awt.Component an, sie ist abstrakt, aber
keine ihrer Methoden ist abstrakt.
Nochmal das obige Beispiel, aber diesmal ohne Fehler:
public abstract class Abstract2 // OK { public void nichtAbstract() { } public abstract void schonAbstract() ; // Semikolon nicht vergessen !! }
Noch etwas müssen wir uns merken: Eine abstrakte Methode kann weder statisch noch private sein.
Hier eine kleine Zusammenfassung.
Die letze Einschränkung leuchtet nach kurzem Nachdenken unmittelbar ein. Überlegen Sie mal.
Eine weitere Anwendung von abstrakten Klassen sind Klassen, die sozusagen schon fast fertig sind.
Gemeint damit ist, daß die abstrakte Klasse fast alle Methoden, die für einen bestimmten Zweck
notwendig sind, schon implementiert und lediglich ein oder zwei abstrakte Methoden übrigläßt.
Man verwendet solche Klassen derart, daß man von Ihnen eine Ableitung bildet und die abstrakten
Methoden nach seinen Bedürfnissen implementiert. Ein Beispiel dafür ist die Klasse AbstractAction
aus dem package javax.swing . Hier muß ein Anwender in einer Ableitung nur noch die Methode
actionPerformed() schreiben und seine Klasse ist real.