Sobes.tech
Middle

Kokie yra įterptųjų klasių tipai programavimo kalboje?

sobes.tech AI

Atsakymas iš AI

Java vidiniai klasės:

  1. Statinės vidinės klasės (Static Nested Classes): Elgiasi kaip įprasti statiniai klasės nariai. Neturi prieigos prie išorinės klasės nestatinių narių. Sukuriamos be išorinės klasės egzemplioriaus.

    public class Outer {
        private static String staticMsg = "Statinė žinutė";
        private String instanceMsg = "Egzemplioriaus žinutė";
    
        static class StaticNested {
            void displayStatic() {
                // Prieiga prie išorinės klasės statinių narių
                System.out.println(staticMsg);
                // Neturi prieigos prie išorinės klasės nestatinių narių
                // System.out.println(instanceMsg); // Klaidų kompiliacija
            }
        }
    }
    
  2. Vidinės klasės (Inner Classes): Susijusios su išorinės klasės egzemplioriumi. Turi pilną prieigą prie visų (static ir non-static) narių, įskaitant privačius. Gali būti deklaruotos kaip private, protected, package-private arba public.

    public class Outer {
        private static String staticMsg = "Statinė žinutė";
        private String instanceMsg = "Egzemplioriaus žinutė";
    
        class Inner {
            void display() {
                // Prieiga prie statinių ir nestatinių narių
                System.out.println(staticMsg);
                System.out.println(instanceMsg);
            }
        }
    }
    
  3. Vietinės klasės (Local Classes): Deklaruojamos bloko viduje (metodas, konstruktorius arba statinis inicializatorius). Prieinamos tik šiame bloke. Gali naudoti final arba efektyviai final vietinius kintamuosius ir parametrus, taip pat visus išorinius narius.

    public class Outer {
        private String instanceMsg = "Egzemplioriaus žinutė";
    
        void methodWithLocalClass() {
            final String localVar = "Vietinis kintamasis"; // arba efektyviai final
    
            class Local {
                void display() {
                    System.out.println(instanceMsg);
                    System.out.println(localVar);
                }
            }
    
            Local localObj = new Local();
            localObj.display();
        }
    }
    
  4. Anoniminės klasės (Anonymous Classes): Bevardės vietinės klasės. Naudojamos vienu metu deklaruoti ir kurti klasės egzempliorių, kuris arba įgyvendina sąsają, arba išplečia klasę. Patogios mažų, vienkartinių objektų kūrimui.

    public class Outer {
        void methodWithAnonymousClass() {
            // Runnable sąsają įgyvendinanti anoniminė klasė
            Runnable myRunnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("Vykdoma iš anoniminės klasės");
                }
            };
            new Thread(myRunnable).start();
    
            // Thread klasės išplėtimas anonimine klase
            Thread myThread = new Thread() {
                @Override
                public void run() {
                    System.out.println("Vykdoma iš anoniminės klasės, išplečiančios Thread");
                }
            };
            myThread.start();
        }
    }
    

Palyginimas tarp vidinių klasių tipų:

Tipas Deklaracijos vieta Prieiga prie išorinės klasės narių Reikia išorinės klasės egzemplioriaus kurti Modifikatoriai
Statinė vidinė klasė Klasės viduje, su static Tik prie statinių Ne Visi
Vidinė klasė (Inner) Klasės viduje (ne statinė) Visų (statinių ir nestatinių) Taip Visi
Vietinė klasė Bloko viduje (metodas, konstruktorius, inicializatorius) Visų išorinių narių + final arba efektyviai final vietinių kintamųjų Taip Ne