Vergleichstabelle
Vergleichsgrundlage | Schnittstelle | Abstrakte Klasse |
---|---|---|
Basic | Wenn Sie nur über die Anforderungen Bescheid wissen, nicht über deren Implementierung, verwenden Sie "Schnittstelle". | Wenn Sie etwas über die Implementierungen wissen, verwenden Sie "abstrakte Klassen". |
Methoden | Die Schnittstelle enthält nur abstrakte Methoden. | Die abstrakte Klasse enthält sowohl abstrakte als auch konkrete Methoden. |
Zugriffsmodifizierer von Methoden | Interface-Methoden sind immer "Public" und "Abstract", auch wenn wir nicht deklarieren. Es kann also als 100% reine abstrakte Klasse bezeichnet werden. | Es ist nicht zwingend, dass die Methode in der abstrakten Klasse öffentlich und abstrakt ist. Es kann auch konkrete Methoden haben. |
Eingeschränkter Modifikator für Methoden | Eine Schnittstellenmethode kann nicht mit den folgenden Modifizierern deklariert werden: Öffentlich: Privat und geschützt Zusammenfassung: final, statisch, synchronisiert, native, strictfp. | Es gibt keine Einschränkungen für die Modifizierer der abstrakten Klassenvariablen. |
Zugriffsmodifizierer für Variablen | Zugriffsmodifizierer für Schnittstellenvariablen sind public, static & final, unabhängig davon, ob wir deklarieren oder nicht. | Die Variablen in der abstrakten Klasse müssen nicht public, static, final sein. |
Eingeschränkte Modifizierer für Variablen | Schnittstellenvariablen können nicht als privat, geschützt, vorübergehend oder flüchtig deklariert werden. | Es gibt keine Einschränkung für die Modifizierer abstrakter Klassenvariablen. |
Initialisierung von Variablen | Die Schnittstellenvariablen müssen zum Zeitpunkt ihrer Deklaration initialisiert werden. | Es ist nicht zwingend, dass abstrakte Klassenvariablen zum Zeitpunkt ihrer Deklaration initialisiert werden müssen. |
Instanz- und statische Blöcke | Innerhalb der Benutzeroberfläche können Sie keine Instanz oder statischen Block deklarieren. | Die abstrakte Klasse erlaubt eine Instanz oder einen statischen Block. |
Konstruktoren | Sie können in der Schnittstelle keinen Konstruktor deklarieren. | Sie können einen Konstruktor innerhalb einer abstrakten Klasse deklarieren. |
Definition der Schnittstelle
Java erlaubt keine Mehrfachvererbung. Das heißt, eine einzelne Klasse kann jeweils nur eine Klasse erben. Der Grund dafür kann an einem Beispiel erklärt werden. Nehmen wir an, wir haben zwei übergeordnete Klassen, A und B, und eine abgeleitete Klasse C. Die abgeleitete Klasse C erbt sowohl die Klassen A als auch B. Jetzt haben beide Klassen A und B die Methode set (), dann wird es eine Frage sein Für die Klasse C soll die set () - Methode dieser Klasse erben. Die Lösung für dieses Problem ist "Schnittstelle".
access_specifier interface Schnittstellenname {Rückgabetyp Methodenname1 (Parameterliste); Rückgabetyp Methodenname2 (Parameterliste); Typ final-varname1 = Wert; Typ final-varname2 = Wert; // ... Rückgabetyp MethodennameN (Parameterliste); Typ final-varnameN = Wert; }
Der Zugriffsbezeichner wird als public deklariert, da die Klassen die Schnittstelle implementieren müssen.
Wir haben nicht das Konzept von "Interface" in C ++. Aber Java und C # definieren die Schnittstelle sehr gut.
Schnittstelle in Java:
- Variablen einer Schnittstelle sind standardmäßig immer public, static und final.
- Variablen müssen zum Zeitpunkt ihrer Deklaration initialisiert werden.
- Variablen können niemals als privat, geschützt, vorübergehend und flüchtig deklariert werden.
- Methoden einer Schnittstelle sind immer öffentlich und abstrakt, während sie niemals als privat, geschützt, endgültig, statisch, synchronisiert, nativ und streng deklariert werden können.
- Sie können keinen Konstruktor innerhalb einer Schnittstelle deklarieren, da der Hauptzweck des Konstruktors die Initialisierung von Klassenvariablen ist. In Schnittstellenvariablen werden sie jedoch zum Zeitpunkt ihrer Deklaration initialisiert.
- Die Schnittstelle kann andere Schnittstellen erben, aber die Klasse, die eine solche Schnittstelle implementiert, muss die Methoden aller geerbten Schnittstellen implementieren.
- Eine Klasse kann mehr als eine Schnittstelle gleichzeitig erben und muss alle Methoden aller geerbten Schnittstellen implementieren.
Die allgemeine Form der Implementierung einer Schnittstelle in Java:
class class_name implementiert Interface_Name {// class-body}
Um ein Interface zu erben, verwendet eine Klasse ein Schlüsselwort "implements", und die Klasse implementiert alle von einem geerbten Interface deklarierten Methoden.
Schnittstelle in C #:
Die Schnittstelle in C # ist der Schnittstelle in Java nahezu ähnlich, mit Ausnahme von:
- Schnittstelle in C # deklariert keine Variablen.
- Dem Namen der Schnittstelle wird ein Großbuchstabe I vorangestellt und ein Doppelpunkt (:) - Zeichen vererbt.
Die allgemeine Form der Implementierung einer Schnittstelle in C #:
class class_name: Schnittstellenname {// class-body}
Definition von abstrakten Klasse
Eine Klasse, die eine oder mehrere abstrakte Methoden enthält, wird als abstrakte Klasse bezeichnet. Eine Klasse wird mit dem Schlüsselwort „abstract“ als abstrakt deklariert, dem das Schlüsselwort „class“ am Anfang der Klassendeklaration vorangeht. Da die abstrakte Klasse die abstrakte Methode enthält, bildet sie einen unvollständigen Typ. Daher können Sie keine Objekte einer abstrakten Klasse erstellen. Wenn eine Klasse eine abstrakte Klasse erbt, muss sie alle abstrakten Methoden der abstrakten Klasse implementieren. Wenn dies nicht der Fall ist, muss sie auch als abstrakt deklariert werden. Das abstrakte Attribut wird so lange vererbt, bis die vollständige Implementierung der abstrakten Methoden erreicht ist.
Die abstrakte Klasse kann auch konkrete Methoden enthalten, die von der abgeleiteten Klasse unverändert verwendet werden können. Sie können jedoch keinen abstrakten Konstruktor oder eine abstrakte statische Methode innerhalb einer abstrakten Klasse deklarieren. Die allgemeine Form der abstrakten Klasse in Java ist wie folgt:
abstrakte Klasse Klassenname {Abstrakte Methodenname1 (); abstrakter Methodenname2 (); : return_type method_name3 (parameter_list) {// konkrete Methode} return_type method_name4 (parameter_list) {// konkrete Methode}};
Das Konzept einer abstrakten Klasse ist in Java und C # ähnlich. Eine abstrakte Klasse unterscheidet sich in C ++ geringfügig.
Wenn eine Klasse in C ++ mindestens eine virtuelle Funktion hat, wird die Klasse zu einer abstrakten Klasse. Anstelle des Schlüsselworts „abstract“ wird das Schlüsselwort „virtual“ verwendet, um eine abstrakte Methode zu deklarieren.
Hauptunterschiede zwischen Schnittstelle und abstrakter Klasse in Java & C #
- Wenn Sie wissen, "was erforderlich ist", aber nicht, "wie es implementiert werden würde", muss die Schnittstelle verwendet werden. Wenn Sie andererseits wissen, was erforderlich ist und teilweise weiß, wie es implementiert werden soll, verwenden Sie eine abstrakte Klasse.
- Eine Schnittstelle hat alle ihre Methoden abstrakt, aber eine abstrakte Klasse hat einige abstrakte Methoden und einige konkrete Methoden.
- Die Methoden innerhalb einer Schnittstelle sind öffentlich und abstrakt und werden daher auch als reine abstrakte Klasse bezeichnet. Auf der anderen Seite sind die Methoden innerhalb eines Abstracts nicht darauf beschränkt, öffentlich und abstrakt zu sein.
- Eine Schnittstellenmethode kann niemals privat, geschützt, endgültig, statisch, synchronisiert, nativ oder strictfp sein. Auf der anderen Seite gibt es keine Einschränkungen für Methoden einer abstrakten Klasse.
- Die Variablen in einer Schnittstelle sind public und final, unabhängig davon, ob wir sie deklarieren oder nicht. Es besteht jedoch keine Einschränkung, dass die Variablen einer abstrakten Klasse nur public und final sind.
- Variablen in einer Schnittstelle können niemals privat geschützt vorübergehend oder flüchtig sein, wohingegen es keine Einschränkung auf Variablen in einer abstrakten Klasse gibt.
- Die Variable einer Schnittstelle muss bei der Deklaration initialisiert werden. Andererseits können die Variablen in einer abstrakten Klasse jederzeit initialisiert werden.
- Innerhalb einer Schnittstelle kann eine Instanz oder ein statischer Block nicht deklariert werden. Sie können jedoch eine Instanz oder einen statischen Block innerhalb einer abstrakten Klasse deklarieren.
- Sie können keinen Konstruktor innerhalb einer Schnittstelle definieren, wohingegen Sie einen Konstruktor innerhalb einer abstrakten Klasse definieren können.
Fazit:
Wenn Sie eine Basisklasse erstellen müssen, die eine verallgemeinerte Form von Methoden enthält, die je nach Bedarf von den abgeleiteten Klassen implementiert werden können, hilft das Konzept der Schnittstelle und der abstrakten Klasse dabei.