Intern , eller indlejret klasse ( engelsk indre klasse ) - i objektorienteret programmering , en klasse , der er fuldstændigt defineret inde i en anden klasse.
Indlejrede klasser er understøttet i programmeringssproget Java siden version 1.1, C# og andre sprog på .NET-platformen, såvel som i programmeringssproget D og i C++ .
En instans af en almindelig (ydre) klasse kan eksistere som et uafhængigt objekt. Dets eksistens kræver ikke tilstedeværelsen af definitioner af andre klasser eller deres forekomster. I tilfælde af en indre klasse kan dens instans ikke eksistere uden at være bundet til dens omsluttende topniveauklasse eller dens instans.
Der er 4 typer af indre klasser i Java :
En forekomst af en indre klasse kan kun eksistere, når der findes en specifik forekomst af den ydre klasse. En sådan logisk forbindelse bestemmer syntaksen for at skabe objekter: først oprettes et objekt af den ydre klasse, og senere oprettes et objekt af den indre klasse på basis af det.
Indre ikke-statiske klasser er deklareret inde i den ydre hovedklasse. Forekomster af sådanne klasser har adgang til public, protected, defaultog privatefelter i den ydre klasse. Samt statiske og ikke-statiske metoder for en ekstern instans med eventuelle adgangsmodifikatorer. På grund af det faktum, at instanser af den indre klasse altid er logisk bundet til instanser af den omgivende klasse, kan de ikke indeholde (selvom de kan arve fra en forfader) definitionen af statiske felter, metoder og klasser (undtagen konstanter). [en]
Et eksempel på en indre klasseerklæring:
klasse Yderklasse { privat int outerField ; klasse InnerClass { int getOuterField () { retur OuterClass . dette . ydre felt ; // denne kodelinje demonstrerer konceptet med en lukning. } } }Oprettelsen af den beskrevne klasse kan beskrives med følgende kodeblok:OuterClass.InnerClass inner = new OuterClass().new InnerClass();
De er deklareret inden for hovedklassen og angivet med nøgleordet static. Objekter af sådanne klasser har ikke adgang til medlemmer af den ydre klasse, undtagen statiske. Dette skyldes det faktum, at et specifikt objekt af den ydre klasse ikke bruges til at oprette en sådan klasse, og på tidspunktet for udførelse af koden for den indre klasse, er der muligvis slet ikke et ydre objekt. Forekomster af statiske indlejrede klasser kan indeholde statiske felter, metoder og klasser i modsætning til andre typer indre klasser.
Et eksempel på en indlejret statisk klasseerklæring:
klasse Yderklasse { privat int outerField ; static int staticOuterField ; statisk klasse _ _ int getOuterField () { retur OuterClass . dette . ydre felt ; // denne kodelinje vil resultere i en kompileringsfejl. } int getStaticOuterField () { retur OuterClass . staticOuterField ; // denne kodelinje er korrekt. } } }Oprettelsen af den beskrevne statiske indlejrede klasse kan beskrives med følgende kodeblok:OuterClass.StaticInnerClass staticInner = new OuterClass.StaticInnerClass();
De er erklæret inde i hovedklassens metoder. Kan kun bruges inden for disse metoder. Har adgang til medlemmer af yderklassen. De har adgang til både lokale variabler og metodeparametre under én betingelse - de variabler og parametre, der bruges af den lokale klasse, skal erklæres final. Kan ikke definere (men kan arve fra) statiske felter, metoder og klasser (undtagen konstanter). [2]
Eksempel:
klasse Yderklasse { privat int outerField ; void methodWithLocalClass ( final int finalParameter ) { int notFinalVar = 0 ; notFinalVar ++ ; klasse InnerLocalClass { void getOuterField () { int a = notFinalVar ; // denne kodelinje vil resultere i en kompileringsfejl. no-final variabler er ikke tilgængelige uden for konteksten. int b = Yderklasse . dette . ydre felt ; // denne kodelinje demonstrerer at kalde et medlem af den omsluttende klasse. } int getParameter () { return finalParameter ; // denne kodelinje demonstrerer adgang til en endelig variabel uden for kontekst. } } } }Oprettelse af den beskrevne lokale klasse er kun mulig inden for selve metoden, strengt under erklæringskoden for selve klassen. Eksempel på oprettelseskode:InnerLocalClass innerLocal = new InnerLocalClass();
De er erklæret inde i hovedklassens metoder. Kan kun bruges inden for disse metoder. I modsætning til lokale klasser har anonyme klasser ikke et navn. Hovedkravet for en anonym klasse er, at den skal arve fra en eksisterende klasse eller implementere en eksisterende grænseflade. Kan ikke definere (men kan arve fra) statiske felter, metoder og klasser (undtagen konstanter). Eksempel:
klasse Yderklasse { /** * Når man definerede en anonym klasse, blev polymorfi anvendt - lyttervariablen * indeholder en forekomst af en anonym klasse, der implementerer en eksisterende * ActionListener-grænseflade. **/ void methodWithAnonymousClass ( final int interval ) { ActionListener listener = new ActionListener () { public void actionPerformed ( ActionEvent hændelse ) { System . ud . println ( "Denne linje udskrives hvert " + interval + " sekunder." ); } }; Timer t = ny Timer ( interval , lytter ); // anonymt klasseobjekt brugt i metoden. t . start (); } }PHP 7 har en mekanisme til at beskrive anonyme klasser, men i modsætning til Java er anonyme klasser ikke forpligtet til at arve fra en eksisterende klasse eller implementere en eksisterende grænseflade på grund af sprogets dynamiske natur. Eksempel:
// Før PHP 7-kode klasse Logger { offentlig funktionslog ( $ msg ) { echo $msg ; } } $util -> setLogger ( ny logger ()); // PHP 7+ kode $util -> setLogger ( ny klasse { offentlig funktionslog($msg) { echo $msg; } });Cay S. Horstmann og Gary Cornell, Core Java , ottende udgave (bind I). Prentice Hall, 2003. ISBN 978-0132354769 ( link til bogside )