Sobes.tech
Middle

Milyen típusú beágyazott osztályok léteznek a programozási nyelvben?

sobes.tech MI

Válasz az MI-től

Java-ban beágyazott osztályok:

  1. Statikus beágyazott osztályok (Static Nested Classes): Hasonlóan viselkednek, mint a szokásos statikus osztálytagok. Nincs hozzáférésük a külső osztály nem-statikus tagjaihoz. Külső osztály példány nélkül jönnek létre.

    public class Outer {
        private static String staticMsg = "Statikus üzenet";
        private String instanceMsg = "Példány üzenet";
    
        static class StaticNested {
            void displayStatic() {
                // Hozzáférés a külső osztály statikus tagjaihoz
                System.out.println(staticMsg);
                // Nem fér hozzá a nem-statikus tagokhoz
                // System.out.println(instanceMsg); // Fordítási hiba
            }
        }
    }
    
  2. Belső osztályok (Inner Classes): A külső osztály példányához kapcsolódnak. Teljes hozzáférésük van minden (static és non-static) taghoz, beleértve a privátakat is. private, protected, package-private vagy public lehetnek.

    public class Outer {
        private static String staticMsg = "Statikus üzenet";
        private String instanceMsg = "Példány üzenet";
    
        class Inner {
            void display() {
                // Hozzáférés a statikus és nem-statikus tagokhoz
                System.out.println(staticMsg);
                System.out.println(instanceMsg);
            }
        }
    }
    
  3. Helyi osztályok (Local Classes): Egy blokk (metódus, konstruktor vagy statikus inicializáló) belsejében vannak deklarálva. Csak ezen a blokkban érhetők el. Hivatkozhatnak final vagy effektív final helyi változókra és paraméterekre, valamint a külső osztály összes tagjára.

    public class Outer {
        private String instanceMsg = "Példány üzenet";
    
        void methodWithLocalClass() {
            final String localVar = "Helyi változó"; // vagy effektív final
    
            class Local {
                void display() {
                    System.out.println(instanceMsg);
                    System.out.println(localVar);
                }
            }
    
            Local localObj = new Local();
            localObj.display();
        }
    }
    
  4. Névtelen osztályok (Anonymous Classes): Név nélküli helyi osztályok. Használják egy osztály deklarálására és példányosítására, amely vagy egy interfészt valósít meg, vagy egy osztályt bővít. Kisebb, egyszer használatos objektumok létrehozására alkalmas.

    public class Outer {
        void methodWithAnonymousClass() {
            // Név nélküli osztály, amely a Runnable interfészt valósítja meg
            Runnable myRunnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("Fut névtelen osztályból");
                }
            };
            new Thread(myRunnable).start();
    
            // Név nélküli osztály, amely a Thread osztályt bővíti
            Thread myThread = new Thread() {
                @Override
                public void run() {
                    System.out.println("Fut névtelen osztályból, amely a Thread-et bővíti");
                }
            };
            myThread.start();
        }
    }
    

A beágyazott osztályok típusainak összehasonlítása:

Osztály típus Deklaráció helye Hozzáférés a külső osztály tagjaihoz Szükséges-e külső osztály példánya a létrehozáshoz Hozzáférési módosítók
Statikus beágyazott osztály Osztályon belül, a static kulcsszóval. Csak a statikusakra. Nem Minden
Belső osztály Osztályon belül (nem-statikus). Mindenre (statikus és nem-statikus) tagokra. Igen Minden
Helyi osztály Blokkban (metódusok, konstruktorok, inicializálók). Minden külső osztály tagjára + final vagy effektív final helyi változók és paraméterek. Igen Nem (final vagy abstract implicit)
Név nélküli osztály Blokkban (kifejezés). Minden külső osztály tagjára + final vagy effektív final helyi változók és paraméterek. Igen Nem