Java: Abstrakte Klassen
In objektorientierten Konzepten werden alle Objekte durch Klassen beschrieben, aber umgekehrt werden nicht alle Klassen verwendet, um Objekte zu beschreiben. Wenn eine Klasse nicht genügend Informationen enthält, um ein bestimmtes Objekt zu beschreiben, ist eine solche Klasse eine abstrakte Klasse.
Abgesehen davon, dass abstrakte Klassen keine Objekte instanziieren können, existieren die anderen Funktionen der Klasse weiterhin. Membervariablen, Membermethoden und Konstruktoren haben dieselben Zugriffsmechanismen wie gewöhnliche Klassen.
Da abstrakte Klassen keine Objekte instanziieren können, müssen abstrakte Klassen vererbt werden, um verwendet werden zu können. Aus diesem Grund wird normalerweise bereits in der Entwurfsphase entschieden, ob eine abstrakte Klasse entworfen werden soll.
Die Elternklasse enthält gemeinsame Methoden der Menge der Unterklassen, aber weil die Elternklasse selbst abstrakt ist, können diese Methoden nicht verwendet werden.
In Java repräsentieren abstrakte Klassen eine Vererbungsbeziehung. Eine Klasse kann nur von einer abstrakten Klasse erben, aber eine Klasse kann mehrere Schnittstellen implementieren.
Abstrakte Klassen
In der Sprache Java verwendet man abstract class, um eine abstrakte Klasse zu definieren. Beispiel wie folgt:
Code der Datei Employee.java:
Beachten Sie, dass sich diese Employee-Klasse nicht unterscheidet. Obwohl diese Klasse eine abstrakte Klasse ist, hat sie weiterhin 3 Membervariablen, 7 Membermethoden und 1 Konstruktor. Wenn Sie nun das folgende Beispiel ausprobieren:
Code der Datei AbstractDemo.java:
Wenn Sie versuchen, die Klasse AbstractDemo zu kompilieren, wird der folgende Fehler erzeugt:
Employee.java:46: Employee is abstract; cannot be instantiated
Employee e = new Employee("George W.", "Houston, TX", 43);
^
1 error
Vererbung abstrakter Klassen
Wir können die Eigenschaften der Klasse Employee auf folgende Weise erben:
Code der Datei Salary.java:
Obwohl wir kein Objekt der Klasse Employee instanziieren können, wird ein Objekt, wenn wir ein Objekt der Klasse Salary instanziieren, 7 Mitgliedsmethoden von der Klasse Employee erben, und über diese Methoden können die drei Mitgliedsvariablen gesetzt oder abgerufen werden.
Code der Datei AbstractDemo.java:
Das obige Programm kompiliert und läuft mit folgendem Ergebnis:
Constructing an Employee Constructing an Employee Call mailCheck using Salary reference -- Within mailCheck of Salary class Mailing check to Mohd Mohtashim with salary 3600.0 Call mailCheck using Employee reference-- Within mailCheck of Salary class Mailing check to John Adams with salary 2400.
Abstrakte Methoden
Wenn Sie eine solche Klasse entwerfen möchten, die eine spezielle Member-Methode enthält, deren konkrete Implementierung von ihren Unterklassen bestimmt wird, dann können Sie diese Methode in der Elternklasse als abstrakte Methode deklarieren.
Das Schlüsselwort abstract kann auch verwendet werden, um abstrakte Methoden zu deklarieren. Eine abstrakte Methode enthält nur einen Methodennamen und hat keinen Methodenkörper.
Eine abstrakte Methode wird nicht definiert; auf den Methodennamen folgt direkt ein Semikolon anstelle von geschweiften Klammern.
Das Deklarieren einer abstrakten Methode hat die folgenden zwei Konsequenzen:
- Wenn eine Klasse eine abstrakte Methode enthält, muss die Klasse eine abstrakte Klasse sein.
- Jede Unterklasse muss die abstrakte Methode der Oberklasse überschreiben oder sich selbst als abstrakte Klasse deklarieren.
Eine Unterklasse, die eine abstrakte Methode erbt, muss diese Methode überschreiben. Andernfalls muss die Unterklasse ebenfalls als abstrakte Klasse deklariert werden. Letztendlich muss es eine Unterklasse geben, die die abstrakte Methode implementiert; andernfalls kann von der ursprünglichen Oberklasse bis zur endgültigen Unterklasse keine von ihnen zum Instanziieren von Objekten verwendet werden.
Wenn die Klasse Salary die Klasse Employee erbt, muss sie die Methode computePay() implementieren:
Code der Datei Salary.java:
Zusammenfassung der Regeln für abstrakte Klassen
1. Abstrakte Klassen können nicht instanziiert werden (ein Fehler, den Anfänger oft machen). Wenn sie instanziiert werden, wird ein Fehler gemeldet und die Kompilierung schlägt fehl. Nur nicht-abstrakte Unterklassen einer abstrakten Klasse können Objekte erstellen.
2. Eine abstrakte Klasse enthält nicht unbedingt abstrakte Methoden, aber eine Klasse mit abstrakten Methoden muss eine abstrakte Klasse sein.
3. Abstrakte Methoden in einer abstrakten Klasse sind nur Deklarationen und enthalten keinen Methodenkörper, das heißt, die konkrete Implementierung der Methode, also die konkrete Funktionalität der Methode, wird nicht bereitgestellt.
4. Konstruktoren und Klassenmethoden (mit static modifizierte Methoden) können nicht als abstrakte Methoden deklariert werden.
5. Eine Unterklasse einer abstrakten Klasse muss konkrete Implementierungen der abstrakten Methoden in der abstrakten Klasse bereitstellen, es sei denn, die Unterklasse ist ebenfalls eine abstrakte Klasse.