In Java zijn alle vier de belangrijkste principes van object-georiënteerd programmeren (OOP) geïmplementeerd: encapsulatie, overerving, polymorfisme en abstractie.
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; } }
extends. Dit bevordert hergebruik van code.public class Animal {} public class Dog extends Animal {}
Animal animal = new Dog(); animal.makeSound(); // roept de implementatie in Dog aan
public interface Drawable { void draw(); }
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
Verhaal
In een project voor een bank maakte een ontwikkelaar alle velden
publicen 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.