7Které čtyři principy OOP (Object-Oriented Programming) Java podporuje?
Java podporuje zapouzdření (encapsulation), abstrakci, dědičnost a polymorfismus. Zapouzdření skrývá vnitřní stav za veřejné API (Application Programming Interface). Abstrakce se zaměřuje na nezbytné chování. Dědičnost vytváří nový typ na základě existujícího typu. Polymorfismus umožňuje kódu pracovat s různými implementacemi prostřednictvím sdíleného kontraktu. V praxi se často dává přednost kompozici před dědičností, protože vytváří nižší míru provázanosti (coupling).
interface PaymentService {
void pay(BigDecimal amount);
}
class CardPaymentService implements PaymentService {
@Override
public void pay(BigDecimal amount) {
// payment implementation
}
}
Zkusit odpovědět na tuto otázku s trenérem AI
8Jaký je rozdíl mezi přetěžováním (overloading) a překrýváním (overriding) metod?
Přetěžování (overloading) znamená, že několik metod má stejný název, ale různé parametry; kompilátor vybírá metodu na základě statických typů argumentů. Překrývání (overriding) znamená, že podtřída nahrazuje implementaci instanční metody z rodičovské třídy; dynamické vazování (runtime dispatch) vybírá metodu na základě skutečného typu objektu. Statické metody jsou skryty (hidden), nikoliv překryty, a soukromé (private) metody nejsou překryty, protože se nedědí jako přístupné členy.
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"); }
}
Zkusit odpovědět na tuto otázku s trenérem AI
9Jaký je rozdíl mezi rozhraním (interface) a abstraktní třídou?
Rozhraní definuje kontrakt a může obsahovat abstraktní metody, výchozí metody (default methods), statické metody, konstanty a privátní pomocné metody. Abstraktní třída může mít navíc stav instance, konstruktory, chráněné atributy (protected fields), sdílenou implementaci a abstraktní nebo konkrétní metody. Třída může dědit (extend) pouze z jedné třídy, ale může implementovat více rozhraní. Rozhraní použijte pro nezávislý kontrakt a abstraktní třídu pro úzce související typy se sdílenou implementací a stavem.
interface Repository<T> {
Optional<T> findById(long id);
}
Zkusit odpovědět na tuto otázku s trenérem AI
10Co znamená klíčové slovo `final`?
Proměnná označená jako `final` může mít hodnotu přiřazenou pouze jednou, ale reference typu `final` neznamená, že je odkazovaný objekt neměnný (immutable). Metodu označenou jako `final` nelze přepsat (override). Třídu označenou jako `final` nelze dědit (extend). Klíčové slovo `final` sděluje záměr programátora a omezuje změny referencí nebo dědičnost, ale samo o sobě neposkytuje kompletně neměnný model ani bezpečnost pro použití ve více vláknech (thread safety).
final int maxAttempts = 3;
final List<String> names = new ArrayList<>();
names.add("Alice"); // allowed
public final void validate() {}
public final class Token {}
Zkusit odpovědět na tuto otázku s trenérem AI
11Co jsou to typy `record` v Javě?
Typ `record` poskytuje kompaktní syntaxi pro neměnné datové nosiče (immutable data carriers). Kompilátor automaticky generuje privátní položky `final`, konstruktor, přístupové metody (accessors), `equals`, `hashCode` a `toString`. Typy `record` jsou užitečné pro DTO (Data Transfer Object), hodnotové objekty (value objects) a výsledky metod. Nejsou náhradou za každou doménovou entitu: validaci lze sice přidat v kompaktním konstruktoru, ale pro složité měnitelné chování, odložené načítání (lazy loading) a modely založené na dědičnosti se typy `record` obvykle nehodí.
public record User(long id, String name) {}
public record Order(List<String> items) {
public Order {
items = List.copyOf(items);
}
}
Zkusit odpovědět na tuto otázku s trenérem AI
12Jak v Javě vytvoříte neměnný (immutable) objekt?
Označte třídu jako `final` nebo pečlivě omezte její dědičnost, položky nastavte jako `private final`, vyhněte se metodám typu setter a provádějte validaci v konstruktoru. Pro měnitelné vstupy vytvářejte defenzivní kopie (defensive copies) a vracejte kopie nebo neupravitelné (unmodifiable) pohledy. Hluboká neměnnost (deep immutability) vyžaduje, aby veškerý vnořený stav byl také neměnný. Položky s modifikátorem `final` pomáhají bezpečnému zveřejnění (safe publication), ale objekt může být stále logicky měnitelný, pokud zpřístupní měnitelnou kolekci nebo měnitelný vnořený objekt.
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;
}
}
Zkusit odpovědět na tuto otázku s trenérem AI