Wie Sie wissen, besteht in Java alles aus Objekten, und Objekte haben einen Zustand (Felder) und ein Verhalten (definiert durch Methoden). Das Verhalten einer Klasse kann sie an andere Klassen binden. Verhalten kann unterschiedliche Merkmale haben, und manchmal kann es bequemer sein, es außerhalb der Klasse zu verlagern, insbesondere wenn es um die Interaktion mit der Außenwelt geht. Genauso wie die Fernbedienung des Fernsehers außerhalb der „Box“ selbst liegt. Die Fernbedienung ist eine Schnittstelle für die Benutzerinteraktion mit TV-Funktionen. Sie können sich zum Beispiel eine Klasse vorstellen, die ein abstraktes Flugzeug oder einen Hubschrauber implementiert. Objekte beider Klassen, wie zum Beispiel die meisten Vögel, können fliegen, und sie tun es alle unterschiedlich. Vielleicht lohnt es sich, diese Funktion in eine separate Entität zu verschieben, und alle potenziellen „Flyer“ werden von dieser Entität geerbt? Wenn Sie bereits mit abstrakten Klassen vertraut sind, können Sie einfach eine abstrakte Klasse Flyable erstellen und daraus die Copter- und Plane-Klassen „erben“. Was aber, wenn es mehrere solcher Eigenschaften gibt? Beispielsweise können Flugzeuge und Hubschrauber fliegen, sich aber auch am Boden fortbewegen. Selbst wenn wir die Ride-Klasse erstellen, können wir ihr Copter und Plane nicht mehr zuweisen. Schließlich hat jede Java-Klasse nur eine übergeordnete Klasse. Schnittstelle in Java - 1Die Verwendung von Schnittstellen in der Java-Sprache löst dieses Problem teilweise. Schnittstellen in Java definieren einige Funktionen, für die es keine spezifische Implementierung gibt, die dann von Klassen implementiert werden, die diese Schnittstellen verwenden. Und eine Klasse kann viele Schnittstellen implementieren. Tatsächlich erklären wir durch die Implementierung einer Schnittstelle in Java, dass unsere Klasse etwas tun kann, und melden ihr Verhalten. Die konkrete Umsetzung des Verhaltens führen wir bereits in der Klasse durch. Also. Ein Flugzeug und ein Hubschrauber starten unterschiedlich: Ein Flugzeug benötigt eine Landebahn, während ein Hubschrauber normalerweise senkrecht abhebt. Solche Details werden am besten innerhalb der Klasse umgesetzt.

Schnittstellen in Java

Um eine Schnittstelle in der Java-Sprache zu definieren, wird das Schlüsselwort interface verwendet. Zum Beispiel:
interface Voice {

    void talk();
}
Die obige Schnittstelle heißt Voice . Eine Schnittstelle in Java kann Konstanten und Methoden definieren, die möglicherweise Implementierungen haben oder nicht. Normalerweise haben Schnittstellenmethoden keine Implementierung, so wie in diesem Beispiel. Methoden in Schnittstellen ohne Implementierung sind wie abstrakte Methoden abstrakter Klassen. Schnittstellenmethoden verfügen normalerweise nicht über Zugriffsmodifikatoren. Der Zugriff ist jedoch standardmäßig öffentlich, da der Zweck einer Schnittstelle darin besteht, Funktionalität für eine Klassenimplementierung zu definieren. Daher sollten alle Funktionen für die Implementierung offen sein. Um eine Schnittstelle zu implementieren, verwenden Sie beim Deklarieren Ihrer Klasse das Schlüsselwort Implements . Wenn eine Schnittstelle außerdem eine Methode ohne Implementierung enthält, muss diese Methode in der implementierenden Klasse implementiert werden.
public class Duck implements Voice {


@Override
public void voice() {
   System.out.println("Quack");
}


    }

Beispiel für einen Schnittstellencode

Nehmen wir ein umfassenderes Beispiel. Jedes (naja, fast jedes) Tier hat die Fähigkeit, Geräusche zu machen. Lassen Sie uns für diesen Fall eine Java-Schnittstellenstimme erstellen . Es verfügt über eine talk()- Methode ohne Implementierung.
public interface Voice {
   void talk();
}
Jetzt müssen alle Klassen, die die Voice- Schnittstelle unterstützen, über eine Implementierung der talk()- Methode verfügen. Erstellen wir zwei Klassen – Cat und Dog – und geben an, dass sie die Voice- Schnittstelle implementieren. Wenn Sie in diesem Fall keine Klasse darin implementieren, funktioniert das Programm nicht. Die Implementierung von Methoden ist sehr einfach. Beim Aufruf der talk()- Methode eines Objekts der Cat- Klasse wird das Textäquivalent eines Miauens auf dem Bildschirm angezeigt, im Fall der Dog- Klasse ein Bellen. Wir werden den Klassen auch Getter, Setter und einen Konstruktor hinzufügen.
public class Cat implements Voice {
   String name;
   String breed;
   int year;

   public Cat(String name, String breed, int year) {
       this.name = name;
       this.breed = breed;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getBreed() {
       return breed;
   }

   public void setBreed(String breed) {
       this.breed = breed;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("meow...");
   }
}
public class Dog implements Voice {
   String name;
   String color;
   int year;

   public Dog(String name, String color, int year) {
       this.name = name;
       this.color = color;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("WOF WOF");
   }
}
Tatsächlich sind unsere Klassen- und Methodenimplementierungen sehr ähnlich. Erstellen wir eine weitere Klasse, Parrot , mit Sprachunterstützung . Nur die Methode talk() funktioniert darin anders: Der Benutzer gibt eine Zeichenfolge in die Konsole ein und der Papagei „wiederholt“ sie mit der Methode talk() .
import java.util.Scanner;

public class Parrot implements Voice {
   String name;
   String color;
   int year;

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       Scanner scanner = new Scanner(System.in);
       System.out.println("WHat should I repeat after you?...");
       String s =  scanner.nextLine();
       System.out.println(s);
   }
}
Lassen Sie uns nun eine Testklasse erstellen und sehen, welches Ergebnis das Programm liefert, wenn wir nacheinander die Methode talk() der Objekte der Klassen Cat , Dog und Parrot aufrufen.
public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Parrot parrot = new Parrot();
       parrot.talk();
   }
}
Die Ausgabe ist unten. Grüner Text ist der einzige Benutzer, der in der Konsole gedruckt wird.
miau... WOF WOF Was soll ich nach dir wiederholen?... Ich bin ein sehr gesprächiger und kluger Vogel. Ich bin ein sehr gesprächiger und kluger Vogel

Standardmethoden

Vor der Veröffentlichung von JDK 8 mussten wir bei der Implementierung einer Schnittstelle in Java alle ihre Methoden in einer Klasse implementieren. Gleichzeitig könnte die Java-Schnittstelle selbst nur Methodendefinitionen ohne spezifische Implementierung enthalten. JDK 8 fügt neue Funktionalität hinzu – Standardmethoden. Jetzt können Java-Schnittstellen nicht nur Methodendefinitionen, sondern auch Standardimplementierungen haben. Sie werden verwendet, wenn die Klasse die Schnittstelle implementiert, aber die Methode nicht implementiert. Lassen Sie uns beispielsweise die talk()- Methode in der Voice- Schnittstelle in die Standardmethode ändern. Wir werden auch eine neue Voice -fähige Duck- Klasse schreiben , die keine Implementierung der Talk- Methode hat.
public interface Voice {
   default void talk() {
       System.out.println("I can talk...");
   }
}
public class Duck implements Voice {

   public void moveForward() {
       System.out.println(" Quack, I am moving forward...");
   }

   public void TurnRight(){
       System.out.println("I am turning right...");
   }
   public void TurnLeft(){
       System.out.println("I am turning left...");

   }

   public void Stop() {
       System.out.println("Quack. I am relaxing on the surface of the water...");
   }

   public void fly(){
       System.out.println("I am flying!!!");
   }

}
Jetzt ändern wir unsere Testklasse ein wenig.
public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Duck duck = new Duck();
       duck.talk();
   }
}
Die Ausgabe ist hier:
miau... WOF WOF Ich kann reden...
Sehen? In Objekten der Klassen Dog und Cat wird die überschriebene Methode talk() aufgerufen, in einem Objekt der Klasse Duck jedoch die Standardmethode von interface. Somit ist die Standardmethode nur eine Methode ohne Modifikatoren und wird mit dem Standardschlüsselwort gekennzeichnet. Wir müssen die Standardmethode nicht in der Klasse implementieren, die die Schnittstelle implementiert, aber wir können sie überschreiben.

Statische Methoden

Da statische JDK 8-Methoden in Java-Schnittstellen verfügbar sind, ähneln sie Klassenmethoden:
interface Voice {

    void talk();

    static void check(){

        System.out.println("checked...");
    }
}
Um auf eine statische Methode einer Schnittstelle zu verweisen, schreiben Sie wie bei Klassen den Namen der Schnittstelle und der Methode:
public static void main(String[] args) {

    Voice.check();
}

Mehrfachimplementierung von Schnittstellen

Wenn wir mehrere Schnittstellen in der Java-Klasse anwenden müssen, werden sie alle mit einem Komma nach dem Wort „ implementiert “ aufgelistet :
public class Duck implements Swimmable, Flyable, Voice {

    public void moveForward() {
        System.out.println(" Quack, I am moving forward...");
    }

    public void TurnRight(){
        System.out.println("I am turning right...");
    }
    public void TurnLeft(){
        System.out.println("I am turning left...");

    }

    public void Stop() {
        System.out.println("Quack. I am relaxing on the surface of the water...");
    }

    public void fly(){
        System.out.println("I am flying!!!");
    }

}