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:

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