Schnittstelle (Java) - Interface (Java)

Eine Schnittstelle in der Programmiersprache Java ist ein abstrakter Typ , der verwendet wird, um ein Verhalten anzugeben, das Klassen implementieren müssen. Sie ähneln Protokollen . Schnittstellen werden mit dem interface Schlüsselwort deklariert und dürfen nur Methodensignatur- und Konstantendeklarationen (Variablendeklarationen, die als staticund deklariert sind final) enthalten. Alle Methoden einer Schnittstelle enthalten keine Implementierung (Methodenrümpfe) , wie von allen Versionen unter Java 8. Beginnend mit Java 8 defaultund staticMethoden kann die Durchführung in der haben interfaceDefinition. Dann wurden in Java 9 privateund private staticMethoden hinzugefügt. Derzeit kann eine Java-Schnittstelle bis zu sechs verschiedene Typen haben.

Schnittstellen können nicht instanziiert , sondern implementiert werden. Eine Klasse, die eine Schnittstelle implementiert, muss alle in der Schnittstelle beschriebenen nicht standardmäßigen Methoden implementieren oder eine abstrakte Klasse sein . Objektreferenzen in Java können als Schnittstellentyp angegeben werden; in jedem Fall müssen sie entweder null sein oder an ein Objekt gebunden sein, das die Schnittstelle implementiert.

Ein Vorteil der Verwendung von Schnittstellen besteht darin, dass sie Mehrfachvererbung simulieren . Alle Klassen in Java müssen genau eine Basisklasse haben , die einzige Ausnahme ist java.lang.Object(die Wurzelklasse des Java- Typsystems ); Mehrfachvererbung von Klassen ist nicht erlaubt. Eine Schnittstelle kann jedoch mehrere Schnittstellen erben und eine Klasse kann mehrere Schnittstellen implementieren.

Überblick

Schnittstellen werden verwendet, um Ähnlichkeiten zu codieren, die die Klassen verschiedener Typen teilen, aber nicht notwendigerweise eine Klassenbeziehung darstellen. Zum Beispiel können ein Mensch und ein Papagei beide pfeifen ; es wäre jedoch nicht sinnvoll, Humans und Parrots als Unterklassen einer WhistlerKlasse darzustellen . Vielmehr wären sie höchstwahrscheinlich Unterklassen einer AnimalKlasse (wahrscheinlich mit Zwischenklassen), aber beide würden die WhistlerSchnittstelle implementieren .

Eine andere Verwendung von Interfaces besteht darin, ein Objekt verwenden zu können, ohne seinen Klassentyp zu kennen, sondern nur, dass es ein bestimmtes Interface implementiert. Wenn man sich zum Beispiel über ein Pfeifgeräusch ärgert, kann man nicht wissen, ob es ein Mensch oder ein Papagei ist, weil man nur feststellen könnte, dass ein Pfeifer pfeift. Der Aufruf whistler.whistle()ruft die implementierte Methode whistlevon object auf, whistleregal welche Klasse sie hat, vorausgesetzt, sie implementiert Whistler. In einem praktischeren Beispiel kann ein Sortieralgorithmus ein Objekt vom Typ erwarten Comparable. Somit weiß es, ohne den spezifischen Typ zu kennen, dass Objekte dieses Typs irgendwie sortiert werden können.

Beispielsweise:

interface Bounceable {
    double pi = 3.1415;
    void setBounce();  // Note the semicolon
                       // Interface methods are public, abstract and never final.
                       // Think of them as prototypes only; no implementations are allowed.
}

Eine Schnittstelle:

  • deklariert nur Methodenheader und öffentliche Konstanten.
  • kann nicht instanziiert werden.
  • kann von einer Klasse implementiert werden.
  • kann eine Klasse nicht verlängern.
  • kann mehrere andere Schnittstellen erweitern.

Verwendung

Schnittstelle definieren

Schnittstellen werden mit der folgenden Syntax definiert (vergleiche mit der Klassendefinition von Java ):

[visibility] interface InterfaceName [extends other interfaces] {
        constant declarations
        abstract method declarations
}

Beispiel: öffentliche Schnittstelle Interface1 erweitert Interface2;

Der Rumpf der Schnittstelle enthält abstrakte Methoden , aber da alle Methoden in einer Schnittstelle per Definition abstrakt sind, ist das abstractSchlüsselwort nicht erforderlich. Da die Schnittstelle eine Reihe von exponierten Verhaltensweisen angibt, sind alle Methoden implizit public.

So kann eine einfache Schnittstelle sein

public interface Predator {
    boolean chasePrey(Prey p);
    void eatPrey(Prey p);
}

Die Membertyp-Deklarationen in einer Schnittstelle sind implizit statisch, final und öffentlich, aber ansonsten können sie jede Art von Klasse oder Schnittstelle sein.

Implementieren von Schnittstellen in einer Klasse

Die Syntax zum Implementieren einer Schnittstelle verwendet diese Formel:

... implements InterfaceName[, another interface, another, ...] ...

Klassen können eine Schnittstelle implementieren. Beispielsweise:

public class Lion implements Predator {

    @Override
    public boolean chasePrey(Prey p) {
           // Programming to chase prey p (specifically for a lion)
    }

    @Override
    public void eatPrey(Prey p) {
           // Programming to eat prey p (specifically for a lion)
    }
}

Wenn eine Klasse eine Schnittstelle implementiert und nicht alle ihre Methoden implementiert, muss sie als gekennzeichnet werden abstract. Wenn eine Klasse abstrakt ist, wird erwartet , dass eine ihrer Unterklassen ihre nicht implementierten Methoden implementiert. Wenn jedoch eine der Unterklassen der abstrakten Klasse nicht alle Schnittstellenmethoden implementiert, muss die Unterklasse selbst erneut als gekennzeichnet werden abstract.

Klassen können mehrere Schnittstellen implementieren:

public class Frog implements Predator, Prey { ... }

Schnittstellen können gemeinsame Klassenmethoden verwenden:

class Animal implements LikesFood, LikesWater {
    boolean likes() { return true; }
}

Eine bestimmte Klasse kann jedoch dieselbe oder eine ähnliche Schnittstelle nicht mehrmals implementieren:

class Animal implements Shares<Boolean>, Shares<Integer> ...
// Error: repeated interface

Schnittstellen werden in der Java-Sprache häufig für Callbacks verwendet , da Java weder die Mehrfachvererbung von Klassen noch die Übergabe von Methoden (Prozeduren) als Argumente erlaubt. Um eine Methode als Parameter an eine Zielmethode zu übergeben, besteht die derzeitige Praxis darin, einen Verweis auf eine Schnittstelle zu definieren und zu übergeben, um die Signatur und Adresse der Parametermethode an die Zielmethode zu übergeben, anstatt mehrere Varianten zu definieren der Zielmethode, um jede mögliche aufrufende Klasse unterzubringen.

Unterschnittstellen

Schnittstellen können mehrere andere Schnittstellen erweitern, indem dieselbe Formel wie unten beschrieben verwendet wird. Beispielsweise,

public interface VenomousPredator extends Predator, Venomous {
    // Interface body
}

ist legal und definiert eine Subschnittstelle. Es ermöglicht im Gegensatz zu Klassen eine Mehrfachvererbung. Predatorund Venomouskann möglicherweise Methoden mit derselben Signatur definieren oder erben, sagen wir kill(Prey p). Wenn eine Klasse implementiert VenomousPredator, implementiert sie beide Methoden gleichzeitig.

Beispiele

Einige gängige Java- Schnittstellen sind:

  • Comparablehat die Methode compareTo, die verwendet wird, um zwei Objekte als gleich zu beschreiben oder anzuzeigen, dass eines größer als das andere ist. Generics ermöglichen es der Implementierung von Klassen, anzugeben, welche Klasseninstanzen mit ihnen verglichen werden können.
  • Serializableist eine Marker-Schnittstelle ohne Methoden oder Felder - sie hat einen leeren Körper. Es wird verwendet, um anzugeben, dass eine Klasse serialisiert werden kann . Sein Javadoc beschreibt, wie es funktionieren sollte, obwohl nichts programmgesteuert erzwungen wird

Siehe auch

Verweise

Externe Links