Belső osztály

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt hozzászólók, és jelentősen eltérhet a 2014. augusztus 27-én felülvizsgált verziótól ; az ellenőrzések 20 szerkesztést igényelnek .

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 .

Áttekintés

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.

Belső osztályok a Java nyelvben

A Java -ban négyféle belső osztály létezik :

Belső (nem statikus) osztályok

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();

Statikus beágyazott osztályok

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();

Helyi osztályok

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();

Névtelen (névtelen) osztályok

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 (); } }

Belső osztályok más programozási nyelveken

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; } });

Lásd még

Irodalom

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 )

Jegyzetek

  1. Oracle. A Java™ oktatóanyagok. Belső osztályok . Oracle dokumentáció . Letöltve: 2016. április 12. Az eredetiből archiválva : 2016. március 22..
  2. Helyi osztályok (A Java™ oktatóanyagok > A Java nyelv megtanulása > Osztályok és objektumok) . docs.oracle.com. Letöltve: 2016. április 12. Az eredetiből archiválva : 2016. március 31..

Linkek