7Welche vier OOP-Prinzipien unterstützt Java?
Java unterstützt Kapselung (Encapsulation), Abstraktion (Abstraction), Vererbung (Inheritance) und Polymorphismus (Polymorphism). Kapselung verbirgt den internen Zustand hinter einer öffentlichen API. Abstraktion konzentriert sich auf das wesentliche Verhalten. Vererbung erstellt einen neuen Typ basierend auf einem bestehenden Typ. Polymorphismus ermöglicht es dem Code, mit verschiedenen Implementierungen über einen gemeinsamen Vertrag zu arbeiten. In der Praxis ist Composition oft vorzuziehen gegenüber Inheritance, da sie eine geringere Kopplung erzeugt.
interface PaymentService {
void pay(BigDecimal amount);
}
class CardPaymentService implements PaymentService {
@Override
public void pay(BigDecimal amount) {
// payment implementation
}
}
Diese Frage mit einem KI-Coach beantworten
8Was ist der Unterschied zwischen Method Overloading und Overriding?
Overloading bedeutet, dass mehrere Methoden denselben Namen, aber unterschiedliche Parameter haben; der Compiler wählt die Methode basierend auf statischen Argumenttypen. Overriding bedeutet, dass eine Unterklasse die Implementierung einer Instanzmethode aus einer Elternklasse ersetzt; die Laufzeit-Dispatch wählt die Methode basierend auf dem tatsächlichen Objekttyp. Statische Methoden werden versteckt (hidden), nicht überschrieben (overridden), und private Methoden können nicht überschrieben werden, da sie nicht als zugängliche Mitglieder vererbt werden.
void send(String message) {}
void send(String message, int priority) {}
class Animal {
void speak() { System.out.println("Animal"); }
}
class Dog extends Animal {
@Override
void speak() { System.out.println("Dog"); }
}
Diese Frage mit einem KI-Coach beantworten
9Was ist der Unterschied zwischen einer Interface und einer abstrakten Klasse?
Ein Interface definiert einen Vertrag und kann abstrakte Methoden, Default-Methoden, statische Methoden, Konstanten und private Helfer enthalten. Eine abstrakte Klasse kann zusätzlich Instanzzustand (instance state), Konstruktoren, geschützte Felder (protected fields), gemeinsame Implementierung sowie abstrakte oder konkrete Methoden haben. Eine Klasse kann nur von einer anderen Klasse erben, aber von mehreren Interfaces implementieren. Verwenden Sie ein Interface für einen unabhängigen Vertrag und eine abstrakte Klasse für eng verwandte Typen mit gemeinsamem Zustand und Implementierung.
interface Repository<T> {
Optional<T> findById(long id);
}
Diese Frage mit einem KI-Coach beantworten
10Was bedeutet das Schlüsselwort final?
Eine finale Variable kann nur einmal zugewiesen werden, aber eine finale Referenz macht das referenzierte Objekt nicht unveränderlich (immutable). Eine finale Methode kann nicht überschrieben werden. Eine finale Klasse kann nicht erweitert werden. `final` kommuniziert die Absicht und begrenzt Änderungen der Referenz oder Vererbung, bietet aber allein kein vollständiges unveränderliches Modell oder Thread-Sicherheit.
final int maxAttempts = 3;
final List<String> names = new ArrayList<>();
names.add("Alice"); // allowed
public final void validate() {}
public final class Token {}
Diese Frage mit einem KI-Coach beantworten
11Was sind Records in Java?
Ein Record ist eine kompakte Syntax für unveränderliche Datenträger (immutable data carriers). Der Compiler generiert private finale Felder, einen Konstruktor, Accessoren, `equals`, `hashCode` und `toString`. Records sind nützlich für DTOs, Wertobjekte (value objects) und Methoden-Ergebnisse. Sie ersetzen jedoch nicht jede Domänenentität: Validierung kann in einem kompakten Konstruktor hinzugefügt werden, aber komplexes veränderliches Verhalten, Lazy Loading und auf Vererbung basierende Modelle passen normalerweise schlecht zu Records.
public record User(long id, String name) {}
public record Order(List<String> items) {
public Order {
items = List.copyOf(items);
}
}
Diese Frage mit einem KI-Coach beantworten
12Wie erstellt man ein unveränderliches Objekt in Java?
Machen Sie die Klasse final oder beschränken Sie die Vererbung sorgfältig. Machen Sie Felder private und final, vermeiden Sie Setter und führen Sie Validierungen im Konstruktor durch. Für veränderliche Eingaben erstellen Sie defensive Kopien und geben Sie entweder Kopien oder unmodifizierbare Ansichten (unmodifiable views) zurück. Tiefe Unveränderlichkeit erfordert, dass auch alle verschachtelten Zustände unveränderlich sind. `final` Felder helfen bei der sicheren Veröffentlichung (safe publication), aber ein Objekt kann immer noch logisch veränderbar sein, wenn es eine veränderliche Sammlung oder ein veränderliches verschachteltes Objekt freigibt.
public final class User {
private final String name;
private final List<String> roles;
public User(String name, List<String> roles) {
this.name = name;
this.roles = List.copyOf(roles);
}
public List<String> getRoles() {
return roles;
}
}
Diese Frage mit einem KI-Coach beantworten