Interface in Java – Leitfaden

Interfaces in Java bieten eine Möglichkeit, Abstraktion zu erreichen. Java-Interfaces werden auch verwendet, um den Vertrag für die zu implementierenden Subklassen zu definieren. Zum Beispiel, nehmen wir an, wir möchten eine Zeichnung erstellen, die aus mehreren Formen besteht. Hier können wir ein Interface Shape erstellen und alle Methoden definieren, die verschiedene Arten von Shape-Objekten implementieren werden. Um es einfach zu halten, können wir nur zwei Methoden behalten – draw(), um die Form zu zeichnen, und getArea(), die die Fläche der Form zurückgibt.

Beispiel für ein Java-Interface

Basierend auf den obigen Anforderungen würde unser Shape-Interface so aussehen. Shape.java

package com.journaldev.design;

public interface Shape {

    //implicitly public, static and final
    public String LABLE="Shape";
    
    //interface methods are implicitly abstract and public
    void draw();
    
    double getArea();
}

Wichtige Punkte über Interfaces in Java

  • interface ist der Code, der verwendet wird, um ein Interface in Java zu erstellen.
  • Wir können ein Interface in Java nicht instanziieren.
  • Interface bietet absolute Abstraktion, im letzten Beitrag haben wir über abstrakte Klassen in Java gelernt, um Abstraktion zu bieten, aber abstrakte Klassen können Methodenimplementierungen haben, Interfaces jedoch nicht.
  • Interfaces können keine Konstruktoren haben, da wir sie nicht instanziieren können und Interfaces keine Methode mit Körper haben können.
  • Standardmäßig ist jedes Attribut eines Interfaces öffentlich, statisch und endgültig, daher müssen wir den Attributen keine Zugriffsmodifikatoren bereitstellen, aber wenn wir dies tun, beschwert sich der Compiler auch nicht darüber.
  • Standardmäßig sind Interface-Methoden implizit abstrakt und öffentlich, was völlig sinnvoll ist, da die Methode keinen Körper hat und so die Subklassen die Methodenimplementierung bereitstellen können.
  • Ein Interface kann keine Klasse erweitern, aber es kann ein anderes Interface erweitern. public interface Shape extends Cloneable{} ist ein Beispiel für ein Interface, das ein anderes Interface erweitert. Tatsächlich bietet Java Mehrfachvererbung in Interfaces, was bedeutet, dass ein Interface mehrere Interfaces erweitern kann.
  • Das Schlüsselwort implements wird von Klassen verwendet, um ein Interface zu implementieren.
  • Eine Klasse, die ein Interface implementiert, muss die Implementierung für alle ihre Methoden bereitstellen, es sei denn, es handelt sich um eine abstrakte Klasse. Zum Beispiel könnten wir das oben genannte Interface in einer abstrakten Klasse so implementieren: ShapeAbs.java

package com.journaldev.design;

public abstract class ShapeAbs implements Shape {

    @Override
    public double getArea() {
        // TODO Auto-generated method stub
        return 0;
    }

}

Wir sollten immer versuchen, Programme in Bezug auf Interfaces und nicht Implementierungen zu schreiben, damit wir im Voraus wissen, dass die Implementierungsklassen immer die Implementierung bereitstellen werden und wir in Zukunft leicht zu einer besseren Implementierung wechseln können.

Beispiel für die Implementierung eines Java-Interfaces

Jetzt sehen wir uns einige Implementierungen unseres Shape-Interfaces in Java an. Circle.java

package com.journaldev.design;

public class Circle implements Shape {

    private double radius;

    public Circle(double r){
        this.radius = r;
    }
    
    @Override
    public void draw() {
        System.out.println("Drawing Circle");
    }
    
    @Override
    public double getArea(){
        return Math.PI*this.radius*this.radius;
    }

    public double getRadius(){
        return this.radius;
    }
}

Beachten Sie, dass die Circle-Klasse alle im Interface definierten Methoden implementiert hat und sie auch einige eigene Methoden hat, wie zum Beispiel getRadius(). Die Interface-Implementierungen können mehrere Arten von Konstruktoren haben. Lassen Sie uns eine weitere Interface-Implementierung für das Shape-Interface sehen. Rectangle.java

package com.journaldev.design;

public class Rectangle implements Shape {

    private double width;
    private double height;
    
    public Rectangle(double w, double h){
        this.width=w;
        this.height=h;
    }
    @Override
    public void draw() {
        System.out.println("Drawing Rectangle");
    }

    @Override
    public double getArea() {
        return this.height*this.width;
    }

}

Beachten Sie die Verwendung der Override-Annotation, lernen Sie über Annotations in Java und warum wir immer die Override-Annotation verwenden sollten, wenn wir eine Methode in Java überschreiben. Hier ist ein Testprogramm, das zeigt, wie man in Bezug auf Interfaces und nicht Implementierungen programmiert. ShapeTest.java

package com.journaldev.design;

public class ShapeTest {

    public static void main(String[] args) {
        
        //programming for interfaces not implementation
        Shape shape = new Circle(10);
        
        shape.draw();
        System.out.println("Area="+shape.getArea());
        
        //switching from one implementation to another easily
        shape=new Rectangle(10,10);
        shape.draw();
        System.out.println("Area="+shape.getArea());
        }

}

Output des oben genannten Java-Interface-Beispielprogramms ist:

  • Zeichnen des Kreises
  • Fläche=314.1592653589793
  • Zeichnen des Rechtecks
  • Fläche=100.0

Vorteile von Java-Interfaces

  • Interface bietet einen Vertrag für alle Implementierungsklassen, daher ist es gut, in Bezug auf Interfaces zu programmieren, da Implementierungsklassen die Methoden, die wir verwenden, nicht entfernen können.
  • Interfaces sind ein guter Ausgangspunkt, um Typen zu definieren und eine Top-Level-Hierarchie in unserem Code zu erstellen.
  • Da eine Java-Klasse mehrere Interfaces implementieren kann, ist es meist besser, Interfaces als Oberklasse zu verwenden.

Nachteile von Java-Interfaces

  • Obwohl Interfaces viele Vorteile bieten, haben sie auch einige Nachteile.
  • Wir müssen die Methoden des Interfaces bei der Projektgestaltung sehr sorgfältig wählen, denn wir können später keine Methoden zum Interface hinzufügen oder entfernen, da dies zu Kompilierungsfehlern bei allen Implementierungsklassen führen würde. Manchmal führt dies dazu, dass viele Interfaces die Basis-Schnittstelle in unserem Code erweitern, was schwer zu warten ist.
  • Wenn die Implementierungsklassen ihre eigenen Methoden haben, können wir sie nicht direkt in unserem Code verwenden, weil der Objekttyp ein Interface ist, das diese Methoden nicht hat. Zum Beispiel werden wir im obigen Code einen Kompilierungsfehler für den Code shape.getRadius() erhalten. Um dies zu überwinden, können wir Typumwandlung verwenden und die Methode so verwenden:

Circle c = (Circle) shape;
c.getRadius();

Obwohl die Typumwandlung eigene Nachteile hat.

Das ist alles, was ich für Interfaces in Java habe. Da wir Java-Interfaces häufig verwenden, sollten wir uns ihrer Eigenschaften bewusst sein. Stellen Sie sicher, dass Sie Interfaces bei der Systemgestaltung verwenden und als Vertrag zwischen dem Kunden und den Subklassen, die die Interfaces implementieren. Update: Java 8 hat die Definition von Interfaces mit der Einführung von Default-Methoden und statischen Methodenimplementierungen geändert. Leitfaden

Create a Free Account

Register now and get access to our Cloud Services.

Posts you might be interested in: