In Java sind alle vier Schlüsselprinzipien der objektorientierten Programmierung (OOP) implementiert: Kapselung, Vererbung, Polymorphismus und Abstraktion.
private, protected, public) sowie Getter und Setter zur Erreichung der Kapselung.public class Account { private double balance; public double getBalance() { return balance; } public void deposit(double amount) { this.balance += amount; } }
extends zu erstellen. Dies fördert die Wiederverwendbarkeit von Code.public class Animal {} public class Dog extends Animal {}
Animal animal = new Dog(); animal.makeSound(); // wird die Implementierung in Dog aufrufen
public interface Drawable { void draw(); }
Was passiert, wenn in Java eine Klasse sowohl ein Interface als auch eine abstrakte Klasse erbt, die Methoden mit derselben Signatur haben? Welches Verhalten wird die abgeleitete Klasse zeigen?
Antwort: Wenn sowohl die abstrakte Klasse als auch das Interface dieselbe Methodensignatur definieren, genügt es, diese Methode einmal in der abgeleiteten Klasse zu implementieren. Wenn die abstrakte Klasse jedoch diese Methode implementiert hat, verwendet Java deren Implementierung. Standardmethoden des Interfaces werden nur bei Bedarf überschrieben.
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() gibt "B" aus
Geschichte
In einem Projekt für eine Bank machte der Entwickler alle Felder
publicund griff direkt darauf zu. Dies führte zu unkontrollierten Zustandsänderungen von Objekten und einer schwierigen Fehlersuche. In der Folge musste der gesamte Code umgeschrieben werden, um private Felder und Zugriffs-Methoden zu verwenden.
Geschichte
Einer der neuen Mitarbeiter versuchte, eine private Methode der Basisklasse zu überschreiben, in der Annahme, dass dies Polymorphismus unterstützt. Tatsächlich wurde jedoch eine neue Methode in der abgeleiteten Klasse erstellt, und Aufrufe aus der Basisklasse riefen die Originalversion auf, was unerwartetes Verhalten zur Folge hatte.
Geschichte
Die Verwendung von Interfaces mit Standardmethoden aus mehreren Quellen führte zu dem Fehler "class X inherits unrelated defaults for Y() from types A and B" - der Mitarbeiter wusste nicht, dass solche Konflikte manuell in der abgeleiteten Klasse gelöst werden müssen.