Java - Schnittstellen

Willkommen, aufstrebende Programmierer! Heute tauchen wir in die faszinierende Welt der Java-Schnittstellen ein. Keine Sorge, wenn Sie neu bei der Programmierung sind; ich werde Sie Schritt für Schritt durch dieses Konzept führen, genau wie ich es für zahlreiche Studenten in meinen Jahren des Unterrichtens getan habe. Also, holen Sie sich Ihr Lieblingsgetränk, machen Sie sich bequem und lassen Sie uns gemeinsam auf diese spannende Reise aufbrechen!

Java - Interfaces

Was ist eine Java-Schnittstelle?

Stellen Sie sich vor, Sie bauen einen Roboter (bleiben Sie dran, diese Analogie wird bald Sinn machen!). Sie wissen, dass Sie möchten, dass Ihr Roboter bestimmte Dinge tun soll, wie sich zu bewegen und Geräusche zu machen, aber Sie sind sich nicht sicher, wie er diese Dinge genau tun wird. In Java ist eine Schnittstelle wie ein Bauplan für Ihren Roboter. Sie definiert, was Ihr Roboter können soll, ohne zu spezifizieren, wie er es tun wird.

In programmiererischen Begriffen ist eine Schnittstelle ein Vertrag, der eine Menge von abstrakten Methoden spezifiziert, die eine Klasse implementieren muss. Es ist eine Möglichkeit, Abstraktion zu erreichen und eine gemeinsame Verhaltensweise zu definieren, die von mehreren Klassen geteilt werden kann.

Eine Schnittstelle in Java deklarieren

Beginnen wir mit einem einfachen Beispiel. So deklarieren wir eine Schnittstelle:

public interface Roboter {
void bewegen();
void geräuschMachen();
}

In diesem Beispiel haben wir eine Schnittstelle namens Roboter mit zwei abstrakten Methoden deklariert: bewegen() und geräuschMachen(). Beachten Sie, dass diese Methoden keine Körper haben - sie sind nur Deklarationen. Es liegt an den Klassen, die diese Schnittstelle implementieren, die tatsächliche Code für diese Methoden bereitzustellen.

Eigenschaften von Java-Schnittstellen

Bevor wir weiter gehen, zusammenfassen wir einige wichtige Eigenschaften von Java-Schnittstellen:

  1. Alle Methoden in einer Schnittstelle sind implizit public und abstract.
  2. Schnittstellen können nicht direkt instanziert werden.
  3. Eine Schnittstelle kann mehrere Schnittstellen erweitern.
  4. Variablen in einer Schnittstelle sind implizit public, static und final.

Schnittstellen in Java implementieren

Jetzt, wo wir unsere Roboter-Schnittstelle haben, erstellen wir eine Klasse, die sie implementiert. Wir nennen diese Klasse AndroidRoboter:

public class AndroidRoboter implements Roboter {
@Override
public void bewegen() {
System.out.println("Android Roboter geht auf zwei Beinen.");
}

@Override
public void geräuschMachen() {
System.out.println("Android Roboter sagt: 'Hallo, Mensch!'");
}
}

Hier verwenden wir das Schlüsselwort implements, um anzuzeigen, dass unsere AndroidRoboter-Klasse die Roboter-Schnittstelle implementiert. Dann bieten wir Implementierungen für beide Methoden bewegen() und geräuschMachen() an.

Lassen Sie uns das aufbrechen:

  1. Das @Override-Annotation ist optional, aber empfohlen. Es teilt dem Compiler mit, dass wirabsichtlich eine Methode aus der Schnittstelle überschreiben.
  2. Wir haben spezifische Implementierungen für bewegen() und geräuschMachen() gegeben. Unser Android Roboter geht auf zwei Beinen und kann Hallo sagen!

Unsere Schnittstelle und Klasse verwenden

Jetzt sehen wir, wie wir unsere neue Schnittstelle und Klasse verwenden können:

public class RoboterDemo {
public static void main(String[] args) {
Roboter meinRoboter = new AndroidRoboter();
meinRoboter.bewegen();
meinRoboter.geräuschMachen();
}
}

Wenn wir diesen Code ausführen, sehen wir:

Android Roboter geht auf zwei Beinen.
Android Roboter sagt: 'Hallo, Mensch!'

Beachten Sie, wie wir meinRoboter als Typ Roboter (die Schnittstelle) deklariert haben, aber ihn als AndroidRoboter instanziert haben. Dies ist eine leistungsstarke Funktion von Schnittstellen - wir können an die Schnittstelle programmieren, nicht an die Implementierung. Dies macht unseren Code flexibler und leichter zu ändern in der Zukunft.

Java-Schnittstellen erweitern

Genau wie Klassen können auch Schnittstellen andere Schnittstellen erweitern. Dies ermöglicht es uns, spezialisiertere Schnittstellen zu erstellen. Lassen Sie uns eine fortgeschrittene Roboter-Schnittstelle erstellen:

public interface AdvancedRoboter extends Roboter {
void fliegen();
void schwimmen();
}

Jetzt muss jede Klasse, die AdvancedRoboter implementiert, Implementierungen für bewegen(), geräuschMachen(), fliegen() und schwimmen() bieten.

Mehrfachvererbung mit Schnittstellen

Im Gegensatz zu Klassen, die nur eine Superklasse erweitern können, kann eine Schnittstelle mehrere Schnittstellen erweitern. Dies ist eine Möglichkeit, wie Java eine Form der Mehrfachvererbung bietet. Hier ist ein Beispiel:

public interface Fliegen {
void starten();
void landen();
}

public interface Schwimmen {
void tauchen();
void auftauchen();
}

public interface AmphibischerRoboter extends Roboter, Fliegen, Schwimmen {
void transformMode();
}

Eine Klasse, die AmphibischerRoboter implementiert, müsste Implementierungen für alle Methoden von Roboter, Fliegen, Schwimmen und AmphibischerRoboter bieten.

Standardmethoden in Schnittstellen

Seit Java 8 können Schnittstellen Standardmethoden haben - Methoden mit einer Standardimplementierung. Diese Funktion wurde eingeführt, um es zu ermöglichen, neue Methoden zu Schnittstellen hinzuzufügen, ohne bestehende Implementierungen zu stören. Hier ist ein Beispiel:

public interface ModernerRoboter {
void verarbeiten();

default void starten() {
System.out.println("Starte hoch...");
verarbeiten();
System.out.println("Start abgeschlossen!");
}
}

Klassen, die ModerneRoboter implementieren, müssen verarbeiten() implementieren, aber sie erhalten starten() kostenlos. Sie können starten() überschreiben, wenn sie möchten, aber sie müssen es nicht.

Funktionale Schnittstellen

Eine funktionale Schnittstelle ist eine Schnittstelle, die genau eine abstrakte Methode enthält. Diese sind wichtig für Lambdabedarfungen in Java. Hier ist ein Beispiel:

@FunctionalInterface
public interface Calculator {
int berechnen(int a, int b);
}

Wir können diese Schnittstelle mit einer Lambda-Ausdruck verwenden wie folgt:

Calculator add = (a, b) -> a + b;
System.out.println(add.berechnen(5, 3));  // Ausgabe: 8

Fazit

Puh! Wir haben heute viel Terrain abgedeckt. Von der grundlegenden Schnittstellendeklaration bis hin zu funktionalen Schnittstellen haben Sie jetzt eine solide Grundlage in Java-Schnittstellen. Bedenken Sie, dass Schnittstellen ein leistungsstarkes Werkzeug in der Java-Programmierung sind. Sie ermöglichen es uns, gemeinsames Verhalten zu definieren, eine Form der Mehrfachvererbung zu erreichen und flexibleren und easier zu pflegenden Code zu schreiben.

Während Sie Ihre Java-Reise fortsetzen, werden Sie feststellen, dass Schnittstellen überall auftauchen. Sie werden in den Standardbibliotheken von Java und vielen Designmustern ausgiebig verwendet. Also üben Sie weiter und bald werden Sie wie ein Profi Schnittstellen verwenden!

Happy coding, zukünftige Java-Meister! ??‍??‍?

Credits: Image by storyset