Abstrakte Methoden sind ein mächtiges Werkzeug von Java und verleihen dieser objektorientierten Sprache noch mehr Möglichkeiten, wenn es um Polymorphismus geht. Mit einer abstrakten Java-Methode kann ein Grundgerüst für ein gesamtes Programm erstellt und bei Bedarf angepasst werden.Java Abstract Method und Sie – 1

Was ist eine abstrakte Methode?

Eine abstrakte Methode ist eine Methode, die keine Implementierung hat. Das heißt, es gibt lediglich eine Deklaration, sodass Sie den Namen, den Rückgabetyp und die Variablen kennen, die akzeptiert werden. Hier ist ein Beispiel für eine grundlegende abstrakte Methode:

public abstract int example(int a1, int a2);
Wenn Sie sich diese Methode ansehen, können Sie erkennen, dass sie eine Ganzzahl zurückgibt und zwei Ganzzahlen als Argument akzeptiert. Was Sie nicht sagen können, ist, wie diese Methode implementiert wird. Denn um es zu implementieren, muss man es überschreiben. Beim Erstellen einer abstrakten Methode in Java müssen Sie einige Richtlinien beachten, sonst wird Ihr Programm nicht korrekt kompiliert. Erinnern:
  • Abstrakte Java-Methoden haben keine Implementierung. Das heißt, ihnen sollten niemals geschweifte Klammern und ein Text folgen, der angibt, wie die Methode verwendet werden soll. Es wird einfach mit einem Semikolon abgeschlossen.

  • Wenn Sie eine abstrakte Methode erstellen, kann diese nur in eine abstrakte Klasse eingefügt werden. Das heißt, Sie können keine konkrete Klasse haben, die eine abstrakte Methode enthält.
    ich. Nebenbei bemerkt: Wenn Sie eine abstrakte Klasse haben, kann diese Konstruktoren enthalten. Es muss jedoch keine abstrakte Methode vorhanden sein.

  • Wenn eine konkrete Klasse eine abstrakte Klasse erweitert, muss sie auch alle abstrakten Methoden der übergeordneten Klasse implementieren, sonst kann sie nicht konkret sein und muss als abstrakt deklariert werden.

Die letzten beiden könnten etwas verwirrend sein, also klären wir das gleich.

Erweitern abstrakter Java-Klassen

Nehmen wir an, wir möchten ein Programm über Grundformen schreiben, das Umfang und Fläche zurückgibt. Also erstellen wir eine übergeordnete abstrakte Klasse. Da aber jede Form ihre eigenen Regeln hat, muss jede anders berechnet werden. Deshalb schreiben wir die abstrakte Shape- Klasse wie folgt:

abstract class Shape {
  		String shapeName = " ";
  		Shape(String name) { 
    			this.shapeName = name; 
  		} 

abstract double area();
  		abstract double perimeter();
}
Wenn wir diese abstrakten Methoden nun tatsächlich nutzen wollen, müssen wir die abstrakte Java-Elternklasse Shape erweitern und dann die Methoden instanziieren. Daher muss jede konkrete Klasse die abstrakten Methoden „Area“ und „Perimeter“ implementieren.

class Quadrilateral extends Shape  
{ 
    double length, width; 
      
    Quadrilateral(double l, double w, String name) 
    { 
        super(name); 
        this.length = l; 
        this.width = w; 
    } 
      
    @Override
    public double perimeter()  
    { 
        return ((2*length)+(2*width));
    } 
      
    @Override
    public double area()  
    { 
        return (length*width); 
    } 
}

Implementing the Quadrilateral class would then look like this
class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4, "Rectangle"); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
} 
Die Ausgabe der Konsole sieht dann so aus:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Beachten Sie, dass die Klasse Quadrilateral den Shape(String name) -Konstruktor nicht aus der übergeordneten Klasse Shape instanziieren muss . Das liegt daran, dass es sich nicht um eine abstrakte Methode handelt. Wenn Sie jedoch nur eine Fläche oder einen Umfang in einer Klasse implementieren würden, müsste die neue Klasse abstrakt sein, da sie nicht beides beinhaltet. Sie können auch abstrakte Methoden in Schnittstellen verwenden.

Abstrakte Java-Methoden mit Schnittstellen

Sehen wir uns kurz an, was eine Schnittstelle ist und wie sie sich von einer abstrakten Klasse unterscheidet. In einer Schnittstelle sind alle in einer Schnittstelle deklarierten Variablen öffentlich, statisch und endgültig. Abstrakte Klassen hingegen haben nur nicht-finale Variablen. Alles in einer Schnittstelle ist standardmäßig öffentlich. Eine abstrakte Klasse kann privat, geschützt, öffentlich usw. sein. Schließlich erweitert eine Klasse eine Schnittstelle nicht, sondern implementiert sie. Vor JDK 8 konnte eine Schnittstelle nur abstrakte Methoden enthalten. Nun kann eine Schnittstelle Standard- und statische Methoden haben. Aus diesem Grund haben sich Best Practices von der Verwendung abstrakter Methoden als erweiterbaren Vorlagen entfernt und sich auf Schnittstellen und deren Implementierung konzentriert. Wenn Sie also „Shape“ als Schnittstelle erstellen und diese dann als „Viereck“ implementieren würden, wie würde es aussehen? Zunächst müssten Sie den Shape(String-Name) -Konstruktor abschaffen. Mit nur den beiden abstrakten Methoden würde es so aussehen:

interface Shape {

  abstract double area();
  abstract double perimeter();
}


So the Quadrilateral class would then look like this:
class Quadrilateral implements Shape {  

  double length, width; 
      
    	  Quadrilateral(double l, double w) {
    
    	    this.length = l; 
    	    this.width = w; 
    	  } 
      
    	  @Override
    	  public double perimeter() {
     
    	    return ((2*length)+(2*width));
    	  } 
      
    	  @Override
    	  public double area() {
    
   	    return (length*width); 
    	  } 
}
Schließlich wäre die Verwendung des neuen Quadrilateral , da es die Shape- Schnittstelle implementiert, weitgehend dasselbe:

class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
}
Und der Konsolenausdruck würde so aussehen:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Wenn Sie mehr über die Unterschiede zwischen Schnittstellen und abstrakten Klassen erfahren möchten, finden Sie hier weitere Informationen.

Aber warum sollten abstrakte Java-Methoden verwendet werden?

Es gibt viele Gründe, warum abstrakte Methoden in Java verwendet werden und warum Sie sich mit deren Verwendung vertraut machen sollten. Hier sind drei kurze Gründe, warum Sie sie verwenden sollten, wenn es angebracht ist.
  1. Vermeiden Sie Doppelarbeit – schauen Sie sich unsere Beispielcodierung noch einmal an. Stellen Sie sich vor, Sie und Ihr Team müssten Klassen für andere Formen als ein Rechteck erstellen. Wie viele verschiedene Möglichkeiten gibt es, diesen Kurs zu gestalten? Zehn? Fünfzehn? Und das ist ein einfaches Problem. Stellen Sie sich etwas viel Komplexeres vor. Ihnen und Ihrem Team könnten hundert Möglichkeiten einfallen. Dann stünden Sie vor der gewaltigen Aufgabe, sie zu einem kohärenten Programm zusammenzufügen. Dies bringt uns zu unserem nächsten Punkt: der Definition der Implementierung.

  2. Abstrakte Methoden in Java ermöglichen die Definition von Verwendung und Implementierung – Wenn Sie eine abstrakte Klasse oder Schnittstelle und konstruktionsbedingt abstrakte Methoden verwenden, definieren Sie, wie andere Personen mit Ihrer Schnittstelle interagieren. Dadurch wissen sie, welche Variablen sie verwenden sollten und welche Rückgabetypen sie erwarten können.
    Während sie diese überschreiben und konkrete Klassen erstellen können, die Ihre Schnittstelle auf einzigartige Weise implementieren, legen Sie dennoch den Kernzweck Ihres Codes in Stein. Wenn jemand Shape implementieren möchte, muss er sowohl Umfang als auch Fläche überschreiben oder implementieren.

  3. Lesbarkeit und Debugging – Abstrakte Methoden verbessern die Lesbarkeit Ihres Codes. Wenn Sie eine Klasse schreiben, die eine Schnittstelle implementiert, wissen Sie, worauf Sie achten müssen. Sie wissen, dass jede abstrakte Methode in der Schnittstelle in der Implementierung enthalten sein wird, und das macht es einfacher, Fehler zu lesen und aufzuspüren. Abstrakte Methoden sind nur der Anfang, um zu lernen, wie man Polymorphismus in Java und anderen objektorientierten Sprachen richtig nutzt. Wenn Sie beginnen, sie zu verstehen und zu nutzen, beginnt ein völlig neues Kapitel Ihrer Programmierreise.