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:

/*Dateiname: Employee.java*/ public abstract class Employee { private String name; private String address; private int number; public⟦2⟦Employee Employee(String name, String address, int number) { System.out.println("Erzeuge einen Employee"); this.name = name; this.address = address; this.number = number; } public double computePay() { System.out.println("Innerhalb von Employee computePay"); return 0.0; } public void mailCheck() { System.out.println("Sende einen Scheck an " + this.name + " " + this.address); } public String toString() { return name + " " + address + " " + number; } public String getName() { return name; } public String getAddress() { return address; } public void setAddress(String newAddress) { address = newAddress; } public int getNumber() { return number; } }

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:

/*Dateiname: AbstractDemo.java*/ public class AbstractDemo { public static void main(String [] args) { /*Das Folgende ist nicht erlaubt und wird einen Fehler verursachen*/ Employee e = new Employee("George W.", "Houston, TX", 43); System.out.println("\n mailCheck mit Employee-Referenz aufrufen--"); e.mailCheck(); } }

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:

/*Dateiname: Salary.java*/ public class Salary extends Employee { private double salary; //Jahresgehalt public Salary(String name, String address, int number, double salary) { super(name, address, number); setSalary(salary); } public void mailCheck() { System.out.println("Innerhalb von mailCheck der Klasse Salary "); System.out.println("Scheck senden an " + getName() + " mit Gehalt " + salary); } public double getSalary() { return salary; } public void setSalary(double newSalary) { if(newSalary >= 0.0) { salary = newSalary; } } public double computePay() { System.out.println("Berechne Gehaltszahlung für " + getName()); return salary/52; } }

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:

/*Dateiname: AbstractDemo.java*/ public class AbstractDemo { public static void main(String [] args) { Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00); Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00); System.out.println("Rufe mailCheck mit Salary-Referenz auf --"); s.mailCheck(); System.out.println("\n Rufe mailCheck mit Employee-Referenz auf--"); e.mailCheck(); } }

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.

public abstract class Employee { private String name; private String address; private int number; public abstract double computePay(); //Restlicher Code }

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:

/*Dateiname: Salary.java*/ public class Salary extends Employee { private double salary; // Jahresgehalt public double computePay() { System.out.println("Berechne Gehaltszahlung für " + getName()); return salary/52; } //Restlicher Code }

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.

Weitere Erweiterungen