ProgrammierungJava Entwickler

Beschreiben Sie die grundlegenden Unterschiede zwischen abstrakten Klassen und Interfaces in Java sowie Szenarien, in denen man jedes von ihnen verwenden sollte.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

Abstrakte Klassen können sowohl abstrakte als auch konkrete Methoden (mit Implementierung) sowie Zustände (Feldvariablen) enthalten. Eine Klasse kann nur von einer abstrakten Klasse erben. Abstrakte Klassen werden verwendet, wenn es notwendig ist, einen Teil der Logik und des Zustands für eine Hierarchie von Erben zu verallgemeinern.

Interfaces definieren nur die Methoden-Signaturen (bis Java 8), ab Java 8 können sie Methoden mit Standardimplementierung (default) und statische Methoden enthalten, haben jedoch keinen Zustand. Eine Klasse kann mehrere Interfaces implementieren. Verwenden Sie Interfaces, um ein Verhalten zu definieren, das unabhängig von einer Vererbungshierarchie ist.

Beispiel:

abstract class Animal { String name; public Animal(String name) { this.name = name; } abstract void makeSound(); } interface Movable { void move(); } class Dog extends Animal implements Movable { public Dog(String name) { super(name); } void makeSound() { System.out.println("Woof!"); } public void move() { System.out.println("Runs"); } }

Fangfrage

Was ist der Unterschied zwischen einer abstrakten Klasse mit nur abstrakten Methoden und einem Interface vor Java 8? Können sie austauschbar verwendet werden?

Antwort: Nein, nicht immer. Ein Interface kann keinen Zustand (Instanzvariablen) enthalten und unterstützt außerdem Mehrfachimplementierung, während die Vererbung von abstrakten Klassen einzelnes Erbe ist. Außerdem sind die Methoden-Signaturen eines Interfaces immer public.


Beispiele für reale Fehler aufgrund mangelnder Kenntnisse des Themas


Geschichte

Im Projekt war es notwendig, viele ähnliche Verhaltensweisen, die jedoch zu unterschiedlichen Hierarchien von Objekten gehörten, zu implementieren. Der Entwickler wählte die Verwendung einer abstrakten Klasse, was es unmöglich machte, Mehrfachvererbung zu verwenden. Dies führte später zu umfangreichen Refaktorisierungen und Code-Duplikationen.


Geschichte

In einem großen REST API-Projekt wurde ein Interface mit Feldern (Konstanten) erstellt, in der Annahme, dass es sich um veränderliche Werte wie in einer gewöhnlichen Klasse handeln würde. Infolgedessen führte der Versuch, diese Felder zu ändern, zu einem Silent Failure – die Werte blieben unverändert, der Bug wurde lange nicht gefunden.


Geschichte

Während des Migrationsprozesses auf Java 8 fügten die Entwickler Methoden mit Implementierungen in das Interface hinzu, vergaßen jedoch zu berücksichtigen, dass einige Klassen auch gleichnamige Methoden über eine abstrakte Klasse erben. Dies führte zu Konflikten bei den Methoden und unerwarteten Ergebnissen bei der Auflösung der Vererbung.