Sobes.tech
Middle

Jaké druhy vnořených tříd existují v programovacím jazyce?

sobes.tech AI

Odpověď od AI

Vnořené třídy v Javě:

  1. Statické vnořené třídy (Static Nested Classes): Chovají se jako běžní statičtí členové třídy. Nemají přístup k nestatickým členům vnější třídy. Jsou vytvářeny bez instance vnější třídy.

    public class Outer {
        private static String staticMsg = "Statická zpráva";
        private String instanceMsg = "Zpráva instance";
    
        static class StaticNested {
            void displayStatic() {
                // Přístup ke statickým členům vnější třídy
                System.out.println(staticMsg);
                // Přístup k nestatickým členům vnější třídy není možný
                // System.out.println(instanceMsg); // Kompilační chyba
            }
        }
    }
    
  2. Vnořené třídy (Inner Classes): Jsou spojeny s instancí vnější třídy. Mají plný přístup ke všem (static i nestatickým) členům vnější třídy, včetně soukromých. Mohou být deklarovány jako private, protected, package-private nebo public.

    public class Outer {
        private static String staticMsg = "Statická zpráva";
        private String instanceMsg = "Zpráva instance";
    
        class Inner {
            void display() {
                // Přístup ke statickým a nestatickým členům
                System.out.println(staticMsg);
                System.out.println(instanceMsg);
            }
        }
    }
    
  3. Lokální třídy (Local Classes): Jsou deklarovány uvnitř bloku (metody, konstruktoru nebo statického inicializátoru). Jsou dostupné pouze uvnitř tohoto bloku. Mohou odkazovat na final nebo efektivně final lokální proměnné a parametry, stejně jako na všechny členy vnější třídy.

    public class Outer {
        private String instanceMsg = "Zpráva instance";
    
        void methodWithLocalClass() {
            final String localVar = "Lokální proměnná"; // nebo efektivně final
    
            class Local {
                void display() {
                    System.out.println(instanceMsg);
                    System.out.println(localVar);
                }
            }
    
            Local localObj = new Local();
            localObj.display();
        }
    }
    
  4. Anonymní třídy (Anonymous Classes): Jsou to třídy bez jména. Používají se k deklaraci a současnému vytvoření instance třídy, která buď implementuje rozhraní, nebo rozšiřuje třídu. Jsou vhodné pro malé, jednorázové objekty.

    public class Outer {
        void methodWithAnonymousClass() {
            // Anonymní třída implementující rozhraní Runnable
            Runnable myRunnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("Běží z anonymní třídy");
                }
            };
            new Thread(myRunnable).start();
    
            // Anonymní třída rozšiřující třídu Thread
            Thread myThread = new Thread() {
                @Override
                public void run() {
                    System.out.println("Běží z anonymní třídy rozšiřující Thread");
                }
            };
            myThread.start();
        }
    }
    

Porovnání typů vnořených tříd:

Typ třídy Místo deklarace Přístup ke členům vnější třídy Je potřeba instance vnější třídy pro vytvoření Modifikátory přístupu
Statická vnořená třída Uvnitř třídy, s klíčovým slovem static. Pouze k statickým. Ne Všechy
Vnořená třída (Inner) Uvnitř třídy (ne-statik). Ke všem (statickým i nestatickým) členům. Ano Všechy
Lokální třída Uvnitř bloku (metody, konstruktory, inicializátory). Ke všem členům vnější třídy + final nebo efektivně final lokálním proměnným a parametrům. Ano Ne (final nebo abstract implicitně)
Není pojmenovaná třída Uvnitř bloku (výraz). Ke všem členům vnější třídy + final nebo efektivně final lokálním proměnným a parametrům. Ano Ne