Vnitřní třídy
Proč to potřebuji?
Vnitřní třídy umožňují logicky seskupit třídy, které spolu úzce souvisejí, a zlepšit tak zapouzdření a čitelnost kódu. Jsou základem pro anonymní třídy a pochopení lambda výrazů.
Teorie
Java umožňuje definovat třídu uvnitř jiné třídy. Typy:
- Inner class (nestatická vnitřní) – má přístup k instančním členům vnější třídy
- Static nested class – nemá přístup k instančním členům, chová se jako samostatná třída
- Anonymní třída – jednorázová implementace rozhraní/třídy bez jména
- Lokální třída – definována uvnitř metody
Příklady
public class VnejsiTrida {
private String zprava = "Ahoj";
private static int pocet = 0;
// === 1) Inner class (nestatická) ===
public class VnitrniTrida {
public void vypis() {
// Má přístup k instančním i statickým členům vnější třídy
System.out.println(zprava + " (celkem: " + pocet + ")");
}
}
// === 2) Static nested class ===
public static class StatickaVnitrni {
public void vypis() {
// Má přístup POUZE ke statickým členům
System.out.println("Počet: " + pocet);
// System.out.println(zprava); // CHYBA – není statická
}
}
public void ukazAnonymni() {
// === 3) Anonymní třída ===
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Anonymní implementace: " + zprava);
}
};
r.run();
// Totéž jako lambda (Java 8+):
Runnable r2 = () -> System.out.println("Lambda: " + zprava);
r2.run();
}
public void ukazLokalniTridu() {
// === 4) Lokální třída ===
class LokalniTrida {
void pozdrav() {
System.out.println("Lokální: " + zprava);
}
}
new LokalniTrida().pozdrav();
}
}
// Použití:
VnejsiTrida vnejsi = new VnejsiTrida();
// Inner class – potřebuje instanci vnější třídy
VnejsiTrida.VnitrniTrida vnitrni = vnejsi.new VnitrniTrida();
vnitrni.vypis();
// Static nested – nepotřebuje instanci
VnejsiTrida.StatickaVnitrni staticka = new VnejsiTrida.StatickaVnitrni();
staticka.vypis();
Shrnutí
Klíčové body
- Inner class: přístup ke všem členům vnější třídy, vyžaduje její instanci
- Static nested: přístup jen ke statickým členům, nezávislá na instanci
- Anonymní třída: jednorázová implementace, nahrazena lambdou u funkcionálních rozhraní
- Výhody: logické seskupení, lepší zapouzdření, čitelnější kód