Unterschied zwischen abstrakter Klasse und Schnittstelle ist eine der beliebten Fragen in Vorstellungsgesprächen. Abstrakte Klasse und Schnittstelle sind ein Kernbestandteil der Programmiersprache Java. Die Wahl zwischen einer Schnittstelle oder abstrakten Klasse ist eine Designentscheidung, mit der jeder Architekt konfrontiert wird. In meinen vorherigen Artikeln habe ich so viele Details wie möglich zu Java-Schnittstellen und abstrakten Klassen bereitgestellt. In diesem Beitrag werden wir den Unterschied zwischen abstrakter Klasse und Schnittstelle kennenlernen und wann wir eine Schnittstelle anstelle einer abstrakten Klasse verwenden sollten und umgekehrt.
Unterschied zwischen abstrakter Klasse und Schnittstelle
- Mit dem Schlüsselwort
abstract
wird eine abstrakte Klasse erstellt, das auch bei Methoden verwendet werden kann, während das Schlüsselwortinterface
eine Schnittstelle erstellt, das nicht bei Methoden verwendet werden kann. - Unterklassen verwenden das Schlüsselwort
extends
, um eine abstrakte Klasse zu erweitern, und sie müssen eine Implementierung für alle deklarierten Methoden in der abstrakten Klasse bereitstellen, es sei denn, die Unterklasse ist ebenfalls eine abstrakte Klasse. Unterklassen verwenden das Schlüsselwortimplements
, um Schnittstellen zu implementieren, und müssen eine Implementierung für alle in der Schnittstelle deklarierten Methoden bereitstellen. - Abstrakte Klassen können Methoden mit Implementierung haben, während Schnittstellen absolute Abstraktion bieten und keine Methodenimplementierungen haben können. Beachten Sie, dass ab Java 8 in Schnittstellen Standard- und statische Methoden erstellt werden können, die die Methodenimplementierungen enthalten.
- Abstrakte Klassen können Konstruktoren haben, Schnittstellen jedoch nicht.
- Abstrakte Klassen haben alle Funktionen einer normalen Java-Klasse, mit Ausnahme der Möglichkeit, sie zu instanziieren. Wir können das Schlüsselwort
abstract
verwenden, um eine Klasse abstrakt zu machen, aber Schnittstellen sind ein völlig anderer Typ und können nur öffentliche statische finale Konstanten und Methodendeklarationen haben. - Methoden abstrakter Klassen können Zugriffsmodifizierer wie public, private, protected, static haben, aber Methoden von Schnittstellen sind implizit public und abstract. Wir können keine anderen Zugriffsmodifizierer für Methoden von Schnittstellen verwenden.
- A subclass can extend only one abstract class but it can implement multiple interfaces.
- Abstrakte Klassen können andere Klassen erweitern und Schnittstellen implementieren, Schnittstellen können jedoch nur andere Schnittstellen erweitern.
- Wir können eine abstrakte Klasse ausführen, wenn sie eine
main()
-Methode hat, aber wir können eine Schnittstelle nicht ausführen, da sie keine Implementierung der Hauptmethode haben kann. - Schnittstellen werden verwendet, um den Vertrag für die Unterklassen zu definieren, während abstrakte Klassen auch einen Vertrag definieren können, aber sie können andere Methodenimplementierungen für die Verwendung durch Unterklassen bereitstellen.
Das ist alles für die Unterschiede zwischen einer Schnittstelle und abstrakten Klassen, jetzt können wir dazu übergehen zu erfahren, wann wir eine Schnittstelle anstelle einer abstrakten Klasse verwenden sollten und umgekehrt.
Schnittstelle oder abstrakte Klasse
Die Entscheidung zwischen Schnittstelle oder abstrakter Klasse zur Bereitstellung eines Vertrags für Unterklassen ist eine Designentscheidung und hängt von vielen Faktoren ab. Schauen wir uns an, wann Schnittstellen die beste Wahl sind und wann wir abstrakte Klassen verwenden können.
- Java unterstützt keine Mehrfachvererbung auf Klassenebene, sodass jede Klasse nur eine Oberklasse erweitern kann. Eine Klasse kann jedoch mehrere Schnittstellen implementieren. Daher sind Schnittstellen in den meisten Fällen eine gute Wahl, um die Basis für Klassenhierarchie und Vertrag bereitzustellen. Auch das Programmieren in Bezug auf Schnittstellen ist eine bewährte Praxis beim Programmieren in Java.
- Wenn es viele Methoden im Vertrag gibt, ist eine abstrakte Klasse nützlicher, da wir eine Standardimplementierung für einige der Methoden bereitstellen können, die für alle Unterklassen gemeinsam sind. Wenn Unterklassen auch eine bestimmte Methode nicht implementieren müssen, können sie die Implementierung vermeiden. Im Fall einer Schnittstelle muss die Unterklasse jedoch die Implementierung für alle Methoden bereitstellen, auch wenn sie nutzlos ist und die Implementierung nur ein leerer Block ist.
- Wenn unser Basivertrag ständig geändert wird, können Schnittstellen Probleme verursachen, da wir keine zusätzlichen Methoden zur Schnittstelle deklarieren können, ohne alle Implementierungsklassen zu ändern. Mit der abstrakten Klasse können wir die Standardimplementierung bereitstellen und nur die Implementierungsklassen ändern, die tatsächlich die neuen Methoden verwenden werden.
Verwenden Sie sowohl abstrakte Klassen als auch Schnittstellen
Die Verwendung von Schnittstellen und abstrakten Klassen zusammen ist der beste Ansatz, um ein System zu entwerfen. Zum Beispiel ist in JDK die java.util.List
eine Schnittstelle, die viele Methoden enthält. Daher gibt es eine abstrakte Klasse java.util.AbstractList
, die eine skelettierte Implementierung für alle Methoden der List-Schnittstelle bereitstellt. Auf diese Weise kann jede Unterklasse diese Klasse erweitern und nur die erforderlichen Methoden implementieren. Es ist immer ratsam, mit einer Schnittstelle als Grundlage zu beginnen und Methoden zu definieren, die jede Unterklasse implementieren sollte. Wenn es jedoch Methoden gibt, die nur bestimmte Unterklasse implementieren sollten, können wir die Basisschnittstelle erweitern und eine neue Schnittstelle mit diesen Methoden erstellen. Die Unterklassen haben dann die Möglichkeit, zwischen der Basisschnittstelle und der Kinderschnittstelle zu wählen, um sie gemäß ihren Anforderungen zu implementieren. Wenn die Anzahl der Methoden stark zunimmt, ist es keine schlechte Idee, eine skelettierte abstrakte Klasse bereitzustellen, die die Kinderschnittstelle implementiert und den Unterklassen Flexibilität bietet, zwischen Schnittstelle und abstrakter Klasse zu wählen.
Java 8 Schnittstellenänderungen
Von Java 8 an können wir Methodenimplementierungen in den Schnittstellen haben. Wir können Standard- sowie statische Methoden in den Schnittstellen erstellen und eine Implementierung für sie bereitstellen. Dies hat die Kluft zwischen abstrakten Klassen und Schnittstellen überbrückt, und jetzt sind Schnittstellen der Weg zu gehen, weil wir sie weiter erweitern können, indem wir Standardimplementierungen für neue Methoden bereitstellen. Für weitere Details siehe Java 8 Interface Standard Statische Methoden.