538 Stimmen

Wie sollte ich den Unterschied zwischen einem Interface und einer abstrakten Klasse erklärt haben?

In einem meiner Interviews wurde ich gebeten, den Unterschied zwischen einem Interface und einer abstrakten Klasse zu erklären.

Hier ist meine Antwort:

Methoden eines Java-Interfaces sind implizit abstrakt und können nicht implementiert werden. Eine Java-abstrakte Klasse kann Instanzmethoden haben, die ein Standardverhalten implementieren.

In einem Java-Interface deklarierte Variablen sind standardmäßig final. Eine abstrakte Klasse kann nicht-finale Variablen enthalten.

Elemente eines Java-Interfaces sind standardmäßig öffentlich. Eine Java-abstrakte Klasse kann die üblichen Arten von Klassenelementen wie private, geschützte usw. haben.

Ein Java-Interface sollte mit dem Schlüsselwort "implements" implementiert werden; Eine Java-abstrakte Klasse sollte mit dem Schlüsselwort "extends" erweitert werden.

Ein Interface kann nur ein anderes Java-Interface erweitern, eine abstrakte Klasse kann eine andere Java-Klasse erweitern und mehrere Java-Interfaces implementieren.

Eine Java-Klasse kann mehrere Interfaces implementieren, aber nur eine abstrakte Klasse erweitern.

Der Interviewer war jedoch nicht zufrieden und sagte mir, dass diese Beschreibung "buchhalterisches Wissen" widerspiegelte.

Er bat mich um eine praktischere Antwort und erklärte, wann ich eine abstrakte Klasse anstelle eines Interfaces wählen würde, unter Verwendung praktischer Beispiele.

Wo habe ich einen Fehler gemacht?

5voto

Steve Chambers Punkte 33674

Ein Interface ist wie eine Gruppe von Genen, die öffentlich dokumentiert sind, um eine Art von Effekt zu haben: Ein DNA-Test wird mir sagen, ob ich sie habe - und wenn ja, kann ich öffentlich bekannt geben, dass ich ein "Träger" bin und ein Teil meines Verhaltens oder Zustands wird sich ihnen anpassen. (Aber natürlich kann ich viele andere Gene haben, die Merkmale außerhalb dieses Bereichs liefern.)

Eine abstrakte Klasse ist wie der verstorbene Vorfahr einer einhäusigen Spezies(*): Sie kann nicht zum Leben erweckt werden, aber ein lebender (d.h. nicht abstrakter) Nachkomme erbt all ihre Gene.

(*) Um dieses Metapher zu dehnen, lassen Sie uns sagen, dass alle Mitglieder der Spezies das gleiche Alter erreichen. Das bedeutet, dass alle Vorfahren eines verstorbenen Vorfahren ebenfalls tot sein müssen - und ebenso müssen alle Nachkommen eines lebenden Vorfahren lebendig sein.

4voto

In wenigen Worten würde ich so antworten:

  • Vererbung über Klassenhierarchie impliziert eine Zustandsvererbung;
  • während Vererbung über Schnittstellen für Verhaltensvererbung steht;

Abstrakte Klassen können als etwas zwischen diesen beiden Fällen betrachtet werden (sie führen einen Zustand ein, zwingen aber auch dazu, ein Verhalten zu definieren), eine vollständig abstrakte Klasse ist eine Schnittstelle (dies ist eine Weiterentwicklung von Klassen, die nur aus virtuellen Methoden bestehen, soweit ich mit ihrer Syntax vertraut bin).

Natürlich haben sich die Dinge ab Java 8 etwas geändert, aber die Idee ist immer noch die gleiche.

Ich denke, das reicht für ein typisches Java-Interview, wenn Sie nicht gerade bei einem Compiler-Team ein Vorstellungsgespräch haben.

3voto

Rodney P. Barbati Punkte 1551

Um es auf eine einfache, vernünftige Antwort zu reduzieren, die Sie in einem Interview geben können, biete ich Folgendes an...

Ein Interface wird verwendet, um eine API für eine Familie von verwandten Klassen zu spezifizieren - die Beziehung ist das Interface. Üblicherweise wird es in einer Situation mit mehreren Implementierungen verwendet, wobei die richtige Implementierung entweder durch Konfiguration oder zur Laufzeit ausgewählt wird. (Es sei denn, Sie verwenden Spring, in diesem Fall ist ein Interface im Grunde genommen ein Spring Bean). Interfaces werden oft verwendet, um das Problem der multiplen Vererbung zu lösen.

Eine abstrakte Klasse ist eine Klasse, die speziell für die Vererbung entworfen wurde. Das bedeutet auch mehrere Implementierungen, wobei alle Implementierungen eine gemeinsame Eigenschaft aufweisen (die in der abstrakten Klasse zu finden ist).

Wenn Sie es auf den Punkt bringen wollen, dann sagen Sie, dass eine abstrakte Klasse oft einen Teil eines Interfaces implementiert - der Job gehört Ihnen!

3voto

user2822053 Punkte 219

Ein Interface ist rein abstrakt. Wir haben keinen Implementierungscode im Interface.

Abstrakte Klasse enthält sowohl Methoden als auch deren Implementierung.

Klicken Sie hier, um ein Tutorial über Interfaces und abstrakte Klassen anzusehen

3voto

MaheshVarma Punkte 2030

Sie wählen in Java das Interface, um das Diamantproblem bei Mehrfachvererbung zu vermeiden.

Wenn Sie möchten, dass alle Ihre Methoden von Ihrem Client implementiert werden, entscheiden Sie sich für ein Interface. Das bedeutet, dass Sie die gesamte Anwendung abstrakt entwerfen.

Sie wählen eine abstrakte Klasse, wenn Sie bereits wissen, was gemeinsam ist. Nehmen wir zum Beispiel eine abstrakte Klasse Auto. Auf höherer Ebene implementieren Sie die gemeinsamen Methoden wie calculateRPM(). Es handelt sich um eine gemeinsame Methode und Sie lassen den Client sein eigenes Verhalten implementieren, wie zum Beispiel calculateMaxSpeed() usw. Wahrscheinlich haben Sie dies anhand einiger Beispiele aus Ihrem täglichen Job bereits erklärt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X