Belső vagy beágyazott osztály ( angolul inner class ) - az objektum-orientált programozásban egy olyan osztály , amely teljesen egy másik osztályon belül van definiálva.
A beágyazott osztályok támogatottak a Java programozási nyelven az 1.1-es verzió óta, a C# -ban és más nyelveken a .NET platformon, valamint a D programozási nyelven és a C++ nyelven .
Egy közönséges (külső) osztály példánya létezhet független objektumként. Létezése nem igényli más osztályok vagy példányaik definícióinak jelenlétét. Egy belső osztály esetében a példánya nem létezhet anélkül, hogy ne lenne kötve a körülvevő felső szintű osztályhoz vagy példányához.
A Java -ban négyféle belső osztály létezik :
Egy belső osztály példánya csak akkor létezhet, ha létezik a külső osztály egy adott példánya. Egy ilyen logikai kapcsolat határozza meg az objektumok létrehozásának szintaxisát: először a külső osztály objektuma jön létre, majd később egy belső osztály objektuma jön létre az alapján.
A belső, nem statikus osztályok a fő külső osztályon belül vannak deklarálva. Az ilyen osztályok példányai hozzáférhetnek a külső osztály public, protected, defaultés privatemezőihez. Valamint egy külső példány statikus és nem statikus metódusai bármilyen hozzáférésmódosítóval. Tekintettel arra, hogy a belső osztály példányai mindig logikailag kötődnek a környező osztály példányaihoz, nem tartalmazhatják (bár örökölhetik egy őstől) a statikus mezők, metódusok és osztályok meghatározását (az állandók kivételével). [egy]
Példa egy belső osztály deklarációra:
class OuterClass { privát int külső mező ; class InnerClass { int getOuterField () { visszatérés OuterClass . ezt . külső mező ; // ez a kódsor a lezárás fogalmát mutatja be. } } }A leírt osztály létrehozása a következő kódblokk segítségével írható le:OuterClass.InnerClass inner = new OuterClass().new InnerClass();
Ezeket a főosztályon belül deklarálják, és a kulcsszóval jelölik static. Az ilyen osztályok objektumai nem férnek hozzá a külső osztály tagjaihoz, kivéve a statikusakat. Ennek oka az a tény, hogy a külső osztály egy adott objektumát nem használják fel ilyen osztály létrehozására, és a belső osztály kódjának végrehajtásakor előfordulhat, hogy egyáltalán nem létezik külső objektum. A statikus beágyazott osztályok példányai tartalmazhatnak statikus mezőket, metódusokat és osztályokat, ellentétben más típusú belső osztályokkal.
Példa egy beágyazott statikus osztálydeklarációra:
class OuterClass { privát int külső mező ; static int staticOuterField ; statikus osztály _ _ int getOuterField () { visszatérés OuterClass . ezt . külső mező ; // ez a kódsor fordítási hibát fog eredményezni. } int getStaticOuterField () { visszatérés OuterClass . staticOuterField ; // ez a kódsor helyes. } } }A leírt statikus beágyazott osztály létrehozása a következő kódblokk segítségével írható le:OuterClass.StaticInnerClass staticInner = new OuterClass.StaticInnerClass();
A főosztály metódusain belül deklarálják őket. Csak ezeken a módszereken belül használható. Hozzáférhet a külső osztály tagjaihoz. Mind a helyi változókhoz, mind a metódusparaméterekhez egy feltétel mellett hozzáférhetnek – a helyi osztály által használt változókat és paramétereket deklarálni kell final. Nem definiálható (de örökölhető) statikus mezők, metódusok és osztályok (az állandók kivételével). [2]
Példa:
class OuterClass { privát int külső mező ; void methodWithLocalClass ( final int finalParameter ) { int notFinalVar = 0 ; notFinalVar ++ ; class InnerLocalClass { void getOuterField () { int a = notFinalVar ; // ez a kódsor fordítási hibát fog eredményezni. nem végleges változók nem érhetők el a kontextuson kívül. int b = OuterClass . ezt . külső mező ; // ez a kódsor a befoglaló osztály egy tagjának meghívását mutatja be. } int getParameter () { return finalParameter ; // ez a kódsor egy végső változó kontextuson kívüli elérését mutatja be. } } } }A leírt lokális osztály létrehozása csak magán a metóduson belül lehetséges, szigorúan magának az osztálynak a deklarációs kódja alatt. Példa létrehozási kódra:InnerLocalClass innerLocal = new InnerLocalClass();
A főosztály metódusain belül deklarálják őket. Csak ezeken a módszereken belül használható. A helyi osztályokkal ellentétben az anonim osztályoknak nincs nevük. Az anonim osztályokkal szemben támasztott fő követelmény, hogy örökölnie kell egy meglévő osztályt, vagy meg kell valósítania egy meglévő interfészt. Nem definiálható (de örökölhető) statikus mezők, metódusok és osztályok (az állandók kivételével). Példa:
class OuterClass { /** * Egy névtelen osztály meghatározásakor polimorfizmust alkalmaztunk - a hallgató változót * egy névtelen osztály példányát tartalmazza, amely egy létezőt valósít meg * ActionListener felület. **/ void methodWithAnonymousClass ( végső int intervallum ) { ActionListener figyelő = new ActionListener () { public void actionPerformed ( ActionEvent esemény ) { Rendszer . ki . println ( "Ez a sor minden " + intervallum + " másodpercenként kerül kinyomtatásra." ); } }; Időzítő t = új Időzítő ( intervallum , figyelő ); // a metóduson belül használt névtelen osztályobjektum. t . start (); } }A PHP 7 rendelkezik anonim osztályok leírására szolgáló mechanizmussal, azonban a Java-val ellentétben az anonim osztályoknak nem kell egy meglévő osztályból örökölniük vagy meglévő interfészt implementálniuk a nyelv dinamikus természete miatt . Példa:
// PHP 7 előtti kód osztályú Logger { nyilvános függvénynapló ( $ msg ) { echo $msg ; } } $util -> setLogger ( new Logger ()); // PHP 7+ kód $util -> setLogger ( new class { nyilvános függvénynapló ($msg) { echo $msg; } });Cay S. Horstmann és Gary Cornell, Core Java , nyolcadik kiadás (I. kötet). Prentice Hall, 2003. ISBN 978-0132354769 ( link a könyv oldalára )