ProgrammierungJava-Entwickler

Erzählen Sie, welche grundlegenden Prinzipien der OOP in Java verwendet werden und wie sie in der Praxis umgesetzt werden.

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

Antwort.

In Java sind alle vier Schlüsselprinzipien der objektorientierten Programmierung (OOP) implementiert: Kapselung, Vererbung, Polymorphismus und Abstraktion.

  • Kapselung ermöglicht es, die interne Implementierung einer Klasse zu verbergen und den Zugriff auf Daten nur über Methoden zu gewähren. Java verwendet Zugriffsmodifikatoren (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; } }
  • Vererbung ermöglicht es, eine neue Klasse auf der Basis einer bestehenden Klasse mit dem Schlüsselwort extends zu erstellen. Dies fördert die Wiederverwendbarkeit von Code.
public class Animal {} public class Dog extends Animal {}
  • Polymorphismus äußert sich in der Fähigkeit, dass ein Interface mehreren Typen dienen kann. In Java wird dies durch Methodenüberschreibung und Interfaces erreicht.
Animal animal = new Dog(); animal.makeSound(); // wird die Implementierung in Dog aufrufen
  • Abstraktion wird durch die Deklaration abstrakter Klassen und Interfaces erreicht, die komplexe Systeme vereinfachen.
public interface Drawable { void draw(); }

Fangfrage.

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

Beispiele für reale Fehler aufgrund fehlenden Wissens über die Feinheiten des Themas.


Geschichte

In einem Projekt für eine Bank machte der Entwickler alle Felder public und 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.