Obwohl sowohl extends als auch implements Schlüsselwörter in Java verwendet werden, um das Vererbungskonzept der objektorientierten Programmierung zu implementieren, gibt es einen feinen Unterschied zwischen ihnen. Das extends-Schlüsselwort wird hauptsächlich verwendet, um eine Klasse zu erweitern, d.h. um eine Unterklasse in Java zu erstellen, während das implements-Schlüsselwort verwendet wird, um eine Schnittstelle in Java zu implementieren. Das extends-Schlüsselwort kann auch von einer Schnittstelle verwendet werden, um eine andere Schnittstelle zu erweitern. Um den Unterschied zwischen extends und implements besser zu verstehen, müssen Sie auch den Unterschied zwischen Klasse und Schnittstelle in Java lernen und verstehen.
Obwohl beide ein integraler Bestandteil der Anwendungsentwicklung unter Verwendung der objektorientierten Methodik sind, ist eine Schnittstelle abstrakter als eine Klasse und wird daher verwendet, um eine API oder einen Vertrag zu definieren.
Auf der anderen Seite bietet eine Klasse die konkrete Implementierung der Schnittstelle, d.h. den eigentlichen Code, der die Aufgabe erfüllt. Obwohl eine Klasse auch abstrakt sein kann, um einen Vertrag zu definieren, wird diese Aufgabe in Java am besten von einer Schnittstelle erledigt. Sogar Joshua Bloch hat in Effective Java von der Verwendung von Schnittstellen zur Deklaration des Typs in Java abgeraten, da dies die Mehrfachvererbung in Java fördert, die im Vergleich zu C++ eingeschränkt ist.
Selbst nach Java 8 wird in Java nur die Mehrfachvererbung von Typ und Verhalten unterstützt (durch die Einführung von Standardmethoden in Java 8), aber die Mehrfachvererbung des Zustands wird immer noch nicht unterstützt. Wenn Sie mehr darüber erfahren möchten, warum die Mehrfachvererbung in Java nicht unterstützt wird, lesen Sie hier.
Und wenn Sie neu in der Java-Welt sind, empfehle ich Ihnen auch The Complete Java MasterClass auf Udemy, um Java besser und strukturierter zu lernen. Dies ist einer der besten und aktuellsten Kurse, um Java online zu lernen.

Was bedeutet es, eine Klasse zu erweitern

Eine Klasse in Java kann eine andere Klasse erweitern, um eine Unterklasse zu werden. Wenn die Klasse B die Klasse A erweitert, wird B zur Unterklasse (child) und A zur Oberklasse (parent). Eine Unterklasse kann alle Funktionen der Elternklasse wiederverwenden, und die Wiederverwendung von Code ist ein wichtiger Grund für die Erweiterung einer Klasse, aber nur wenige wissen, dass die definierende Beziehung, die später durch Polymorphismus genutzt wird, wichtiger ist.

Wenn beispielsweise die Klasse B die Klasse A erweitert, kann eine Referenzvariable vom Typ A das Objekt von B enthalten, was bedeutet, dass A jetzt polymorph wird, weil es sowohl A als auch B enthalten kann. Daraus ergibt sich eine Technik zur Erstellung flexibler Software, die als Programmierung für die Schnittstelle und nicht für die Implementierung bekannt ist, bei der man immer Variablen der übergeordneten Klasse oder Schnittstelle verwendet, um den Kernalgorithmus zu definieren.
Der Vorteil dieser Vorgehensweise ist, dass jede neue Klasse, die die übergeordnete Klasse erweitert, Zugang zu diesem Algorithmus hat.
Hier ein Beispiel für die Erweiterung einer Klasse in Java:

class A { public void show() { System.out.println("show"); }}class B extends A { public void display() { System.out.println("display"); } public void show() { System.out.println("better show"); }}public class Main { public static void main(String args) { A a = new B(); // möglich, da B extends A a.show(); // dies ruft nun die show()-Methode der Klasse B auf }}Outputbetter show

Sie sehen, dass B durch die Erweiterung der Klasse A nun Zugriff auf die show()-Methode hat, es kann sogar das Verhalten der show()-Methode überschreiben, was in Java als Methodenüberschreibung bekannt ist. Diese immense Macht wird durch die Verwendung des extends-Schlüsselworts erreicht.
Sie können auch das Head First Design Pattern in Java lesen, um mehr über die Technik der Programmierung für die Schnittstelle als die Implementierung zu erfahren. Das Buch wurde kürzlich aktualisiert und deckt nun auch Java SE 8 ab.

Was bedeutet es, eine Schnittstelle zu implementieren

Die Implementierung einer Schnittstelle unterscheidet sich nicht wesentlich von der Erweiterung einer Klasse, aber es gibt einen zusätzlichen Vorbehalt. Wenn eine Klasse eine Schnittstelle implementiert, muss sie eine Implementierung aller in der Schnittstelle deklarierten Methoden bereitstellen. Wenn sie nicht alle Implementierungen zur Verfügung stellen möchte, kann sie sich selbst als abstrakte Klasse deklarieren.
Wenn Sie diese Regeln nicht befolgen, kann Ihr Programm nicht kompiliert werden. Es gibt viele Beispiele für die Implementierung einer Schnittstelle in Java-Code, aber ich glaube, die Implementierung von Runnable ist die beliebteste. Damit wird eine Runnable-Aufgabe erstellt, die von einem Thread ausgeführt werden kann.

class R implements Runnable{public void run(){ System.out.println("do nothing"); }}

Eine Instanz von R kann nun an jede Methode übergeben werden, die eine Runnable erwartet, wie z.B. an die execute()- und submit()-Methode der ExecutorService-Klasse, um diese Aufgabe in einem Thread-Pool auszuführen. Da unsere Klasse die Methode run(), die einzige Methode der Schnittstelle Runnable, implementiert hat, ist sie eine konkrete Klasse. Wenn sie die run()-Methode nicht implementiert hätte, müssten Sie sie abstrakt machen, indem Sie das Schlüsselwort abstract vor class hinzufügen, z. B.

abstrakte Klasse R implementiert Runnable{}

Wichtige Punkte

Hier sind einige der wichtigen Punkte im Zusammenhang mit extends und implements Schlüsselwort in Java:
1) Eine Klasse kann nur eine andere Klasse in Java erweitern, die Verwendung des extends-Schlüsselworts mit der Schnittstelle führt zu einem Kompilierungsfehler, wie unten gezeigt:

interface I{}class A{}class B extends A{}class C extends I{}

Wenn Sie diese Quelldatei kompilieren, erhalten Sie folgenden Fehler:

$ javac Main.javaMain.java:27: no interface expected hereclass C extends I{^1 error

2) Eine Klasse kann nur eine Klasse erweitern, der Versuch, mehr als eine Klasse zu erweitern, führt wiederum zu einem Kompilierungsfehler, wie unten gezeigt:

class C extends A, B{}$ javac Main.javaMain.java:27: '{' expectedclass C extends A, B{^1 error

3) Eine Schnittstelle kann das extends-Schlüsselwort verwenden, um Unterschnittstellen in Java zu erstellen, z.g. Folgendes ist in Java völlig legal

interface J extends I{}

4) Eine Schnittstelle kann sogar mehrere Schnittstellen erweitern, indem sie das Schlüsselwort extends verwendet, wie unten gezeigt:

interface k extends I, J{}

5) Eine Klasse kann das Schlüsselwort implements verwenden, um eine oder mehrere Schnittstellen in Java zu implementieren, wie unten gezeigt:

Klasse D implementiert I, J, K{}

6) Eine Klasse kann auch die Schlüsselwörter extends und implements zusammen verwenden, um eine Klasse zu erweitern und eine Schnittstelle zu implementieren, was in Java recht häufig vorkommt, wie das folgende Beispiel zeigt:

Klasse E erweitert A implementiert I, J{}

Wenn eine Klasse dies tut, ist sie nun eine Unterklasse von A und eine Unterschnittstelle von I und J, was bedeutet, dass man eine Referenzvariable der Klasse E und der Schnittstelle I, J verwenden kann, um ein Objekt der Klasse E zu speichern, wie unten gezeigt:

I i = new E();J j = new E();A a = new E();

Das gibt der Klasse E immense Macht in Bezug auf die Verwendung von Vererbung und Polymorphismus.
7) Zu guter Letzt kann eine Schnittstelle nicht das Schlüsselwort implements verwenden, um eine Schnittstelle zu implementieren. Das ist in Java illegal und der Compiler gibt einen Fehler aus, wie unten gezeigt:

interface L implements J{}javac Main.javaMain.java:49: '{' expectedinterface L implements J{^1 error

Das ist alles über den Unterschied zwischen extends und implements Schlüsselwort in Java. Es ist klar, dass extends im Allgemeinen verwendet wird, um eine Klasse zu erweitern, und dass implements im Allgemeinen verwendet werden, um eine Schnittstelle zu implementieren. Es gibt zwar noch weitere Feinheiten, z.B. kann eine Schnittstelle auch eine andere Schnittstelle erweitern, um eine Unterschnittstelle zu werden, und eine Klasse kann auch abstrakt sein, nachdem sie eine Schnittstelle implementiert hat, aber was sich nicht ändert, ist, dass beide verwendet werden, um die Eltern-Kind-Beziehung in Java herzustellen.
Wenn Klasse B eine andere Klasse A erweitert, wird sie zu deren Kindern und Klasse A wird zu einem Elternteil. Das Gleiche gilt für die Schnittstelle. Lesen Sie Head First Java und Head First Object-Oriented Analysis, um mehr über die grundlegenden Bausteine der objektorientierten Programmierung in Java zu erfahren.
Weitere Java-Interviewfragen, die Sie interessieren könnten

  • Der Unterschied zwischen Aggregation, Assoziation und Komposition in Java? (Antwort)
  • Der Unterschied zwischen abstrakter Klasse und Schnittstelle in Java? (Antwort)
  • Der Unterschied zwischen Vererbung und Polymorphismus in Java? (Antwort)
  • Der Unterschied zwischen Abstraktion und Polymorphismus in Java? (Antwort)
  • Warum ist Komposition besser als Vererbung in Java? (Artikel)
  • Der Unterschied zwischen statischen und nicht-statischen Variablen in Java? (Antwort)
  • Warum ist eine abstrakte Klasse in Java wichtig? (Meinung)

Weiterbildung
Komplette Java Masterclass
Java Grundlagen: Die Java-Sprache
Java In-Depth: Werden Sie ein kompletter Java-Ingenieur!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.