Java - Abstraktion
Gemäß Wörterbuch, abstractionist die Qualität des Umgangs mit Ideen und nicht mit Ereignissen. Wenn Sie beispielsweise den Fall von E-Mails betrachten, komplexe Details, z. B. was passiert, sobald Sie eine E-Mail senden, ist das von Ihrem E-Mail-Server verwendete Protokoll für den Benutzer nicht sichtbar. Um eine E-Mail zu senden, müssen Sie nur den Inhalt eingeben, die Adresse des Empfängers angeben und auf Senden klicken.
Ebenso ist bei der objektorientierten Programmierung die Abstraktion ein Prozess, bei dem die Implementierungsdetails vor dem Benutzer verborgen werden. Dem Benutzer wird nur die Funktionalität bereitgestellt. Mit anderen Worten, der Benutzer hat die Informationen darüber, was das Objekt tut, anstatt wie es es tut.
In Java wird die Abstraktion mithilfe von abstrakten Klassen und Schnittstellen erreicht.
Abstrakte Klasse
Eine Klasse, die die enthält abstract Das Schlüsselwort in seiner Deklaration wird als abstrakte Klasse bezeichnet.
Abstrakte Klassen können abstrakte Methoden enthalten oder nicht , dh Methoden ohne Körper (public void get ();)
Wenn eine Klasse jedoch mindestens eine abstrakte Methode hat, dann die Klasse must als abstrakt deklariert werden.
Wenn eine Klasse als abstrakt deklariert ist, kann sie nicht instanziiert werden.
Um eine abstrakte Klasse zu verwenden, müssen Sie sie von einer anderen Klasse erben und Implementierungen für die darin enthaltenen abstrakten Methoden bereitstellen.
Wenn Sie eine abstrakte Klasse erben, müssen Sie Implementierungen für alle darin enthaltenen abstrakten Methoden bereitstellen.
Beispiel
Dieser Abschnitt enthält ein Beispiel für die abstrakte Klasse. Um eine abstrakte Klasse zu erstellen, verwenden Sie einfach dieabstract Schlüsselwort vor dem Klassenschlüsselwort in der Klassendeklaration.
/* File name : Employee.java */
public abstract class Employee {
private String name;
private String address;
private int number;
public Employee(String name, String address, int number) {
System.out.println("Constructing an Employee");
this.name = name;
this.address = address;
this.number = number;
}
public double computePay() {
System.out.println("Inside Employee computePay");
return 0.0;
}
public void mailCheck() {
System.out.println("Mailing a check to " + 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;
}
}
Sie können feststellen, dass die Employee-Klasse mit Ausnahme abstrakter Methoden mit der normalen Klasse in Java identisch ist. Die Klasse ist jetzt abstrakt, hat aber noch drei Felder, sieben Methoden und einen Konstruktor.
Jetzt können Sie versuchen, die Employee-Klasse folgendermaßen zu instanziieren:
/* File name : AbstractDemo.java */
public class AbstractDemo {
public static void main(String [] args) {
/* Following is not allowed and would raise error */
Employee e = new Employee("George W.", "Houston, TX", 43);
System.out.println("\n Call mailCheck using Employee reference--");
e.mailCheck();
}
}
Wenn Sie die obige Klasse kompilieren, wird der folgende Fehler angezeigt:
Employee.java:46: Employee is abstract; cannot be instantiated
Employee e = new Employee("George W.", "Houston, TX", 43);
^
1 error
Vererbung der abstrakten Klasse
Wir können die Eigenschaften der Employee-Klasse genau wie die konkrete Klasse folgendermaßen erben:
Beispiel
/* File name : Salary.java */
public class Salary extends Employee {
private double salary; // Annual salary
public Salary(String name, String address, int number, double salary) {
super(name, address, number);
setSalary(salary);
}
public void mailCheck() {
System.out.println("Within mailCheck of Salary class ");
System.out.println("Mailing check to " + getName() + " with salary " + salary);
}
public double getSalary() {
return salary;
}
public void setSalary(double newSalary) {
if(newSalary >= 0.0) {
salary = newSalary;
}
}
public double computePay() {
System.out.println("Computing salary pay for " + getName());
return salary/52;
}
}
Hier können Sie die Employee-Klasse nicht instanziieren, aber Sie können die Gehaltsklasse instanziieren. Mit dieser Instanz können Sie auf alle drei Felder und sieben Methoden der Employee-Klasse zugreifen, wie unten gezeigt.
/* File name : 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("Call mailCheck using Salary reference --");
s.mailCheck();
System.out.println("\n Call mailCheck using Employee reference--");
e.mailCheck();
}
}
Dies ergibt das folgende Ergebnis:
Ausgabe
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.0
Abstrakte Methoden
Wenn eine Klasse eine bestimmte Methode enthalten soll, die tatsächliche Implementierung dieser Methode jedoch von untergeordneten Klassen bestimmt werden soll, können Sie die Methode in der übergeordneten Klasse als Zusammenfassung deklarieren.
abstract Das Schlüsselwort wird verwendet, um die Methode als abstrakt zu deklarieren.
Sie müssen die platzieren abstract Schlüsselwort vor dem Methodennamen in der Methodendeklaration.
Eine abstrakte Methode enthält eine Methodensignatur, jedoch keinen Methodenkörper.
Anstelle von geschweiften Klammern hat eine abstrakte Methode am Ende einen Semoi-Doppelpunkt (;).
Das Folgende ist ein Beispiel für die abstrakte Methode.
Beispiel
public abstract class Employee {
private String name;
private String address;
private int number;
public abstract double computePay();
// Remainder of class definition
}
Das Deklarieren einer Methode als abstrakt hat zwei Konsequenzen:
Die Klasse, die es enthält, muss als abstrakt deklariert werden.
Jede Klasse, die die aktuelle Klasse erbt, muss entweder die abstrakte Methode überschreiben oder sich selbst als abstrakt deklarieren.
Note- Schließlich muss eine untergeordnete Klasse die abstrakte Methode implementieren. Andernfalls hätten Sie eine Hierarchie abstrakter Klassen, die nicht instanziiert werden können.
Angenommen, die Gehaltsklasse erbt die Employee-Klasse, dann sollte sie die implementieren computePay() Methode wie unten gezeigt -
/* File name : Salary.java */
public class Salary extends Employee {
private double salary; // Annual salary
public double computePay() {
System.out.println("Computing salary pay for " + getName());
return salary/52;
}
// Remainder of class definition
}