ProgrammatieJava ontwikkelaar

Beschrijf de belangrijkste verschillen tussen abstracte klassen en interfaces in Java, evenals scenario's waarin je elk van hen moet gebruiken.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

Abstracte klassen kunnen zowel abstracte als concrete methoden (met implementatie) bevatten, evenals toestanden (gegevensvelden). Een klasse kan alleen van één abstracte klasse erven. Abstracte klassen worden gebruikt wanneer het nodig is om een deel van de logica en toestand voor een hiërarchie van afgeleiden te generaliseren.

Interfaces definiëren alleen de handtekeningen van methoden (tot Java 8), en vanaf Java 8 kunnen ze ook methoden met een standaardimplementatie (default) en statische methoden bevatten, maar hebben ze geen toestand. Een klasse kan meerdere interfaces implementeren. Gebruik interfaces om een set van gedrag te definiëren die onafhankelijk is van de erfgoedhiërarchie.

Voorbeeld:

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("Woef!"); } public void move() { System.out.println("Rent"); } }

Misleidende vraag

Wat is het verschil tussen een abstracte klasse met alleen abstracte methoden en een interface tot Java 8? Kunnen ze uitwisselbaar worden gebruikt?

Antwoord: Nee, niet altijd. Een interface kan geen toestand (instantievelden) bevatten en ondersteunt bovendien meervoudige implementatie, terwijl de afleiding van een abstracte klasse enkelvoudig is. Bovendien zijn de handtekeningen van methoden in een interface altijd public.


Voorbeelden van echte fouten door gebrek aan kennis van de nuance van het onderwerp


Verhaal

Op een project was het vereist om meerdere objecten die vergelijkbaar gedrag vertonen, maar tot verschillende hiërarchieën behoren, interfaces te implementeren. De ontwikkelaar koos ervoor om een abstracte klasse te gebruiken, waardoor meervoudige erfelijkheid niet mogelijk was. Dit leidde tot aanzienlijke refactoring en duplicatie van code.


Verhaal

In een groot REST API-project werd een interface met velden (constanten) aangemaakt, in de veronderstelling dat dit wijzigbare waarden zouden zijn, zoals in een gewone klasse. Als gevolg hiervan leidde het proberen deze velden te wijzigen tot Silent Failure — de waarden bleven hetzelfde, en de bug werd lange tijd niet gevonden.


Verhaal

Tijdens de migratie naar Java 8 voegde de ontwikkelaars methoden met implementatie toe aan de interface, maar vergaten ze rekening te houden met het feit dat sommige klassen ook gelijknamige methoden erven via een abstracte klasse. Dit leidde tot methodenconflicten en onverwachte resultaten bij de afhandelingslogica.