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:
-
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 } } } -
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-privatevagypubliclehetnek.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); } } } -
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
finalvagy effektívfinalhelyi 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(); } } -
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 |