Sisäinen tai sisäkkäinen luokka ( englanniksi inner class ) - olioohjelmoinnissa luokka , joka on kokonaan määritelty toisen luokan sisällä.
Sisäkkäisiä luokkia tuetaan Java -ohjelmointikielellä versiosta 1.1 lähtien, C# ja muilla .NET-alustan kielillä sekä D -ohjelmointikielellä ja C++ :lla .
Tavallisen (ulomman) luokan ilmentymä voi esiintyä itsenäisenä objektina. Sen olemassaolo ei edellytä muiden luokkien tai niiden esiintymien määritelmien olemassaoloa. Sisäisen luokan tapauksessa sen ilmentymä ei voi olla olemassa ilman, että se on sidottu sitä ympäröivään ylätason luokkaan tai sen ilmentymään.
Javassa on neljän tyyppisiä sisäluokkia:
Sisäisen luokan ilmentymä voi olla olemassa vain, kun ulkoisen luokan tietty esiintymä on olemassa. Tällainen looginen yhteys määrittää syntaksin objektien luomiselle: ensin luodaan ulomman luokan objekti ja myöhemmin sen pohjalta sisäisen luokan objekti.
Sisäiset ei-staattiset luokat ilmoitetaan pääulkoluokan sisällä. Tällaisten luokkien ilmentymillä on pääsy ulomman luokan public, protectedja kenttiin default. privateSekä ulkoisen ilmentymän staattiset ja ei-staattiset menetelmät millä tahansa pääsymäärittäjällä. Koska sisäisen luokan ilmentymät ovat aina loogisesti sidottu ympäröivän luokan ilmentymiin, ne eivät voi sisältää (vaikka ne voivat periä esi-isältä) staattisten kenttien, menetelmien ja luokkien (vakiota lukuun ottamatta) määritelmiä. [yksi]
Esimerkki sisäisestä luokan ilmoituksesta:
class OuterClass { yksityinen int ulkokenttä ; class InnerClass { int getOuterField () { palauta OuterClass . tämä . ulkokenttä ; // tämä koodirivi osoittaa sulkemisen käsitteen. } } }Kuvatun luokan luomista voidaan kuvata seuraavalla koodilohkolla:OuterClass.InnerClass inner = new OuterClass().new InnerClass();
Ne ilmoitetaan pääluokassa ja merkitään avainsanalla static. Tällaisten luokkien kohteilla ei ole pääsyä ulomman luokan jäseniin, paitsi staattisiin. Tämä johtuu siitä, että ulkoisen luokan tiettyä objektia ei käytetä tällaisen luokan luomiseen, ja sisäisen luokan koodin suorittamishetkellä ulkoista objektia ei välttämättä ole ollenkaan. Staattisten sisäkkäisten luokkien ilmentymät voivat sisältää staattisia kenttiä, menetelmiä ja luokkia, toisin kuin muuntyyppiset sisäiset luokat.
Esimerkki sisäkkäisestä staattisesta luokkamäärityksestä:
class OuterClass { yksityinen int ulkokenttä ; static int staticOuterField ; staattinen luokka _ _ int getOuterField () { palauta OuterClass . tämä . ulkokenttä ; // tämä koodirivi johtaa käännösvirheeseen. } int getStaticOuterField () { palauta OuterClass . staticOuterField ; // tämä koodirivi on oikein. } } }Kuvatun staattisen sisäkkäisen luokan luomista voidaan kuvata seuraavalla koodilohkolla:OuterClass.StaticInnerClass staticInner = new OuterClass.StaticInnerClass();
Ne ilmoitetaan pääluokan metodien sisällä. Voidaan käyttää vain näissä menetelmissä. Pääsy ulomman luokan jäseniin. Heillä on pääsy sekä paikallisiin muuttujiin että menetelmäparametreihin yhdellä ehdolla - paikallisen luokan käyttämät muuttujat ja parametrit on ilmoitettava final. Staattisia kenttiä, menetelmiä ja luokkia (paitsi vakioita) ei voi määrittää (mutta voi periä niistä). [2]
Esimerkki:
class OuterClass { yksityinen int ulkokenttä ; void methodWithLocalClass ( final int finalParameter ) { int notFinalVar = 0 ; notFinalVar ++ ; class InnerLocalClass { void getOuterField () { int a = notFinalVar ; // tämä koodirivi johtaa käännösvirheeseen. ei-lopullisia muuttujia ei ole saatavilla kontekstin ulkopuolella. int b = OuterClass . tämä . ulkokenttä ; // tämä koodirivi osoittaa sulkevan luokan jäsenen kutsumisen. } int getParameter () { return finalParameter ; // tämä koodirivi osoittaa, että lopulliseen muuttujaan päästään irti kontekstista. } } } }Kuvatun paikallisen luokan luominen on mahdollista vain itse menetelmässä, tiukasti itse luokan ilmoituskoodin alapuolella. Esimerkki luontikoodista:InnerLocalClass innerLocal = new InnerLocalClass();
Ne ilmoitetaan pääluokan metodien sisällä. Voidaan käyttää vain näissä menetelmissä. Toisin kuin paikallisilla luokilla, anonyymeillä luokilla ei ole nimeä. Anonyymin luokan päävaatimus on, että sen on perittävä olemassa olevasta luokasta tai toteutettava olemassa oleva rajapinta. Staattisia kenttiä, menetelmiä ja luokkia (paitsi vakioita) ei voi määrittää (mutta voi periä niistä). Esimerkki:
class OuterClass { /** * Anonyymiä luokkaa määriteltäessä käytettiin polymorfismia - kuuntelijamuuttujaa * sisältää anonyymin luokan esiintymän, joka toteuttaa olemassa olevan * ActionListener käyttöliittymä. **/ void methodWithAnonymousClass ( viimeinen int interval ) { ActionListener- kuuntelija = uusi ActionListener () { public void actionPerformed ( ActionEvent - tapahtuma ) { Järjestelmä . ulos . println ( "Tämä rivi tulostetaan joka " + intervalli + " sekunti." ); } }; Ajastin t = uusi Ajastin ( intervalli , kuuntelija ); // menetelmän sisällä käytetty anonyymi luokkaobjekti. t . aloita (); } }PHP 7:ssä on mekanismi nimettömien luokkien kuvaamiseen, mutta toisin kuin Java, nimettömien luokkien ei tarvitse periytyä olemassa olevasta luokasta tai toteuttaa olemassa olevaa käyttöliittymää kielen dynaamisen luonteen vuoksi . Esimerkki:
// PHP 7 -koodia edeltävä koodi luokan metsuri { julkinen toimintoloki ( $ msg ) { echo $msg ; } } $util -> setLogger ( uusi Loggeri ()); // PHP 7+ -koodi $util -> setLogger ( uusi luokka { julkinen toimintoloki ($msg) { echo $msg; } });Cay S. Horstmann ja Gary Cornell, Core Java , kahdeksas painos (I osa). Prentice Hall, 2003. ISBN 978-0132354769 ( linkki kirjan sivulle )