Sobes.tech
Middle

Jaké druhy vnořených tříd existují?

sobes.tech AI

Odpověď od AI

Statické vnořené třídy a vnořené třídy (nestatické vnořené třídy).

  • Statické vnořené třídy:

    • Deklarují se klíčovým slovem static.
    • Mají přístup pouze ke statickým členům (polím a metodám) vnější třídy, včetně soukromých.
    • Nemají přímý přístup k nestatickým členům vnější třídy.
    • Mohou být vytvořeny bez instance vnější třídy.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        static class StaticNested {
            void display() {
                System.out.println("Statická proměnná: " + staticVar);
                // System.out.println("Instance proměnná: " + instanceVar); // Chyba kompilace
            }
        }
    }
    
  • Vnořené třídy (nestatické vnořené třídy):

    • Deklarují se bez klíčového slova static.
    • Mají plný přístup ke všem členům (statickým i nestatickým) vnější třídy, včetně soukromých.
    • Nemohou obsahovat statické členy (pole nebo metody), kromě konečných konstant.
    • Vyžadují instanci vnější třídy pro jejich vytvoření.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        class Inner {
            void display() {
                System.out.println("Statická proměnná: " + staticVar);
                System.out.println("Instance proměnná: " + instanceVar);
            }
        }
    }
    
  • Lokální třídy:

    • Deklarují se uvnitř metod, konstruktorů nebo inicializačních bloků.
    • Mají přístup ke všem konečným a efektivně konečným lokálním proměnným, stejně jako k členům vnější třídy, ve které jsou definovány.
    • Jejich oblast viditelnosti je omezena blokem, ve kterém jsou deklarovány.
    class Outer {
        void myMethod() {
            final int localVar = 5; // Efektivně final
    
            class LocalInner {
                void display() {
                    System.out.println("Lokální proměnná: " + localVar);
                }
            }
    
            LocalInner local = new LocalInner();
            local.display();
        }
    }
    
  • Anonymní třídy:

    • Třídy bez jména.
    • Vytvářejí se a instanciují současně.
    • Často se používají k implementaci rozhraní nebo rozšíření tříd.
    interface MyInterface {
        void doSomething();
    }
    
    class Outer {
        void myMethod() {
            MyInterface anon = new MyInterface() {
                @Override
                public void doSomething() {
                    System.out.println("Dělá něco anonymně.");
                }
            };
            anon.doSomething();
        }
    }
    

Hlavní rozdíly mezi statickými vnořenými třídami a vnořenými třídami:

Charakteristika Statická vnořená třída Vnořená třída
Klíčové slovo static Není přítomno
Přístup k členům Pouze ke statickým členům vnější třídy Všechny členy vnější třídy
Vytvoření instance Bez instance vnější třídy Vyžaduje instanci vnější třídy