ProgrammatieJava ontwikkelaar

Vertel over de belangrijkste OOP-principes die worden gebruikt in Java en hoe deze in de praktijk worden geïmplementeerd?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

In Java zijn alle vier de belangrijkste principes van object-georiënteerd programmeren (OOP) geïmplementeerd: encapsulatie, overerving, polymorfisme en abstractie.

  • Encapsulatie stelt je in staat om de interne implementatie van een klasse te verbergen en toegang tot de gegevens alleen via methoden te bieden. Java gebruikt toegangsmutatoren (private, protected, public) en getters/setters om encapsulatie te bereiken.
public class Account { private double balance; public double getBalance() { return balance; } public void deposit(double amount) { this.balance += amount; } }
  • Overerving maakt het mogelijk om een nieuwe klasse te creëren op basis van een bestaande met behulp van het sleutelwoord extends. Dit bevordert hergebruik van code.
public class Animal {} public class Dog extends Animal {}
  • Polymorfisme komt tot uiting in de mogelijkheid dat één interface voor meerdere types kan dienen. In Java wordt dit bereikt door middel van methodenoverschrijvingen en interfaces.
Animal animal = new Dog(); animal.makeSound(); // roept de implementatie in Dog aan
  • Abstractie wordt bereikt door abstracte klassen en interfaces te declareren, waardoor complexe systemen worden vereenvoudigd.
public interface Drawable { void draw(); }

Misleidende vraag.

Wat gebeurt er als een Java-klasse een interface en een abstracte klasse erft die methoden met dezelfde handtekening hebben? Welk gedrag zal de afgeleide klasse vertonen?

Antwoord: Als zowel de abstracte klasse als de interface een identieke handtekening van de methode definiëren, is het voldoende om deze methode eenmaal in de afgeleide klasse te implementeren. Mocht de abstracte klasse deze methode hebben geïmplementeerd, dan gebruikt Java die implementatie. Standaardmethoden van de interface worden alleen overschreven indien nodig.

interface A { default void foo() { System.out.println("A"); }} abstract class B { void foo() { System.out.println("B"); }} class C extends B implements A {} // new C().foo() geeft "B" weer

Voorbeelden van echte fouten door onwetendheid over de nuances van het onderwerp.


Verhaal

In een project voor een bank maakte een ontwikkelaar alle velden public en benaderde ze direct. Dit leidde tot ongecontroleerde veranderingen in de toestand van objecten en moeilijkheden bij het opsporen van fouten. Uiteindelijk moest de gehele code worden herschreven om gebruik te maken van private-velden en toegangsmethoden.


Verhaal

Een van de nieuwe medewerkers probeerde een private-methode van de basis klasse te overschrijven, in de veronderstelling dat dit polymorfisme ondersteunt. Maar in feite werd er een nieuwe methode in de dochterklasse gemaakt, en aanroepen vanuit de basis klasse leidden naar de originele versie, wat resulteerde in onverwacht gedrag.


Verhaal

Het gebruik van interfaces met standaardmethoden uit meerdere bronnen leidde tot de fout "class X inherits unrelated defaults for Y() from types A and B" — de medewerker wist niet dat dergelijke conflicten handmatig in de dochterklasse moeten worden opgelost.