Indre klasser i java

Indre klasse som betyr
som navnet sier, kalles en klasse i en annen klasse En Indre Klasse.
Indre klasser har et spesielt forhold til den inneholdende klassen ved at den har tilgang til alle medlemmer av ytre klasse(til og med private seg).
dette skyldes at en indre klasse også er medlem av ytre klasse, akkurat som andre felt og metoder.
siden en indre klasse er en klasse i en annen klasse, kan den også bli referert til som en nestet klasse.
typer av indre klasser
en indre klasse kan være av følgende typer.

  1. Normal Eller Vanlig Eller Nestet Indre klasse (normalt referert til som Bare Indre klasse)
  2. Metode Lokal Indre klasse.
  3. Anonym Indre klasse.
  4. Statisk nestet klasse

1. Nestet Indre Klasse
Denne delen vil grave inn i alle detaljer i en indre klasse. For enkelhet, vurder følgende klasser

class Outer { private String outerField = "Outer"; class Inner { private String innerField = "Inner"; }}

Her Ytre Er den ytre klassen og Indre er den indre klassen som er inneholdt I Ytre.

Opprette objekt Av Indre klasse
en indre klasse er inne i en annen klasse. Denne klassen kalles ytre klasse. Dermed kan en indre klasse ikke eksistere uten ytre klasse, og det samme gjelder for dens objekt (eller forekomst).
et objekt av indre klasse kan ikke eksistere uten et objekt av ytre klasse.
Dette betyr at for å opprette en forekomst av indre klasse, må du ha en forekomst av ytre klasse.
dermed kan objekt av indre klasse opprettes ved den nedenfor angitte metoden.

// first, create object of outer classOuter outerObject = new Outer();// create object of inner classInner innerObject = outerObject.new Inner();

som klart fra eksemplet, for å skape et objekt av indre klasse, er et objekt av ytre klasse nødvendig.
Det er også en korthåndsmetode for å skape indre klasseobjekt.

Inner innerObject = new Outer().new Inner();

denne metoden krever også ytre klasseobjekt.
Bare Remember….An objekt av indre klasse kan ikke opprettes uten et objekt av dets inneholdende (Eller Ytre klasse).

Opprette Indre klasseobjekt I Ytre Klasse
Forrige eksempel antar at du instantierer indre klasse fra et sted utenfor ytre klassen.
Men i de fleste tilfeller er et objekt av indre klasse bare nødvendig innenfor den ytre klassen, siden ytre klasse benytter seg av indre klasse.
Så hvordan lager vi et objekt av indre klasse fra innsiden av ytre klasse?
Vurder modifisert prøveklasse nedenfor.

class Outer { private String outerField = "Outer"; public void createInnerClassObject() { // create an object of inner class Inner innerObject = new Inner(); } class Inner { private String innerField = "Outer"; }}

Legg Merke til linjen Inner innerObject = new Inner();.
tidligere ble det sagt at et indre klasseobjekt ikke kan opprettes uten et objekt av ytre klasse, men kodebiten ovenfor gjør det. Forvirret !!!!
over syntaks er gyldig fordi den er skrevet inne i en metode for ytre klasse.
når denne koden utføres, er det allerede en forekomst av ytre klasse tilstede, som kjører metoden.

Husk Alltid, For å skape (eller få tilgang til) et objekt av indre klasse, bør det være en forekomst av ytre klasse.

for å oppsummere,

  1. når et objekt av indre klasse er opprettet fra ytre klasse, kan det opprettes direkte som Inner innerObject = new Inner();.
  2. når et objekt av indre klasse opprettes fra utsiden av ytre klasse, må det opprettes som Inner innerObject = new Outer().new Inner();.

når objekter av ytre og indre klasse skrives ut, genereres følgende utdata:

Ytre klasse forekomst: Ytre@659e0bfd
Indre klasse forekomst : Ytre$Indre@2a139a55

Refererer Til ytre Klasse forekomst, felt og metoder fra Indre klasse
en indre klasse er også medlem av sin inneholdende klasse som andre felt og metoder.
dermed kan den få tilgang til andre felt og metoder i ytre klasse på samme måte som andre felt og metoder får tilgang til hverandre, direkte.
dette gjelder ved tilgang til ytre klassefelt og metoder fra indre klasse.

Men når det refereres til forekomsten av ytre klasse, er det en forskjell. For å referere til gjeldende forekomst av en klasse, brukes this søkeord.
ved bruk av this refererer indre klasse til nåværende forekomst av indre klasse og ikke dens ytre klasse.
for å referere til forekomst av ytre klasse fra indre klasse, må vi legge til klassenavn til this søkeord.

for å referere til ytre klasseforekomst fra indre klasse, bruk Outer.this syntaks.
Se nedenfor eksempel for forstaelse.

class Outer { private String outerField = "Outer"; public void createInnerClassObject() { // create an object of inner class Inner innerObject = new Inner(); } class Inner { private String innerField = "Outer"; public innerClassMethod() { // access outer class field System.out.println("Outer field : " + outerField); // access inner class instance System.out.println("Inner instance : " + this); // access outer class instance System.out.println("Outer instance : " + Outer.this); } }}

Utgang

Ytre felt: Ytre
Indre forekomst:
Ytre forekomst :

2. Metode Lokal Indre Klasse
som navnet antyder, er en klasse definert i en metode En Metode Lokal Indre Klasse.
Ja, det er mulig.
du kan definere en klasse i en metode som vist nedenfor.

// outer classclass Outer { // outer class method public void createClass() { // class inside a method class Inner { // inner class method public void innerMethod() { System.out.println("Method local inner class"); } } // inner class ends } // method ends}

over koden har en Klasse Ytre som inneholder en metode.
denne metoden definerer en klasse som er inne i metodekroppen, derav kalt metode lokal indre klasse.
Legg Merke Til At Indre klasse også har sin egen metodedefinisjon.

Instantiating En Metode lokal indre klasse
Foregående kode erklærer en metode lokal indre klasse, men det skaper ikke noe objekt av indre klasse.
nå oppstår spørsmålet hvordan man lager et objekt av metode lokal indre klasse.
siden en metode lokal indre klasse er definert i en metode, er den bare synlig innenfor den metoden, og dens objekt kan også opprettes bare innenfor den metoden.
under kode skaper et objekt av metode lokal indre klasse og kaller sin metode.

// outer classpublic class Outer { // outer class method public void createClass() { // class inside a method class Inner { // inner class method public void innerMethod() { System.out.println("Method local inner class method called"); } } // inner class ends // create inner class object Inner innerObject = new Inner(); // call inner class method innerObject.innerMethod(); } // outer class method ends // Main method public static void main(String args) { // create object of outer class Outer outerObject = new Outer(); // call outer class method outerObject.createClass(); }}

når koden ovenfor utføres, følger utgangen

metode lokal indre klassemetode kalt

dette viser at når ytre klassemetode kalles, oppretter den et objekt av indre klasse og kaller inner class-metoden.

Metode Lokal Indre Klasse : Poeng Å Huske
Setning som skaper et objekt av metode lokal indre klasse skal skrives utenfor klassekroppen.
dermed skal linjen Inner innerObject = new Inner(); komme etter at den lokale klassen slutter.

  1. en metode lokal indre klasse kan bare startes innenfor metoden der den er deklarert.
    dette er fornuftig siden en metodeklasse kun er synlig i metoden, og dermed kan objektet kun opprettes i den metoden.
  2. en metode lokal indre klasse kan ikke få tilgang til de lokale variablene i metoden der den er deklarert.
    hvis den trenger tilgang til dem, bør de merkes final.
    dette gjelder før java 8.
  3. du får ikke tilgang til en metode lokal variabel i en metode lokal indre klasse og deretter tilordne den på nytt. Dette vil være en kompilatorfeil.
    dette gjelder fra java 8 siden versjoner før java 8 ikke engang gir deg tilgang til en metode lokal variabel i den indre klassen.
  4. en metode lokal indre klasse kan få tilgang til feltene og andre metoder i klassen som metoden som inneholder indre klasse tilhører.
  5. en metode lokal indre klasse kan få tilgang til static – feltene og andre static – metoder i klassen som metoden som inneholder indre klasse tilhører bare når den inneholdende metoden er static.

3. Anonyme Indre Klasser
Anonym betyr hvis navn ikke er kjent. I sammenheng med java er En Anonym klasse en som ikke har noe navn.
begrepet Anonym klasse gjelder Bare For Indre klasser siden ytre klasser skal ha et navn.
En Anonym klasse er en indre klasse fordi den alltid vil bli definert i en annen klasse.

typer anonym klasse i java
i virkeligheten er en anonym klasse en implementering av en allerede eksisterende klasse eller et grensesnitt som er skrevet et annet sted, men det er definert igjen i en annen klasse etter behov.
Dette kan høres forvirrende ut, men eksemplene som følger vil klargjøre konseptet.

basert på om den anonyme klassen er en implementering av en klasse eller et grensesnitt, kan den tilhøre følgende to kategorier

A. Underklasse av en klasse
La oss starte med et eksempel først

// Already existing classclass Website {public void printName() {System.out.println("No website till now");}}class SearchEngine { // Notice the syntax Website w = new WebSite() { public void printName() { System.out.println("Website is codippa.com"); } };}

i eksemplet ovenfor er det en klasse som heter Nettsted som allerede er opprettet.
En annen klassesøkemotor omdefinerer denne klassen, implementerer metoden og tilordner den til en referansevariabel som er av samme type som den faktiske klassen.
det er også mulig å ringe den nylig implementerte metoden ved hjelp av denne referansevariabelen.

Husk at Den nylig implementerte Anonyme klassen er en underklasse av den faktiske klassen.
Det følger Polymorfisme og objektet kan sendes hvor som helst Objektet Til Nettstedsklassen forventes.
Gå gjennom eksemplet nedenfor for illustrasjon.

class Website { public void printName() { System.out.println("No website till now"); }}class SearchEngine { // Notice the syntax Website w = new WebSite() { public void printName() { System.out.println("Website is codippa.com"); } }; // Expects an instance of Website class public void getWebsite(Website web) { // call the method of Website class web.printName(); } // Main method public static void main(String args) { // create an object of this class SearchEngine obj = new SearchEngine(); // call its method and pass instance of Website class obj.getWebsite(obj.w); }}

I Stedet for å forhåndsdefinere implementeringen Av Nettstedsklassen, kan den defineres der det er nødvendig, det vil si når du ringer til getWebsite-metoden.
dermed kan hovedmetoden endres som

public static void main(String args) { SearchEngine obj = new SearchEngine(); // Notice the implementation of Website class as argument obj.getWebsite(new Website() { public void print() { System.out.println("Dynamic implementation"); } });}

ovennevnte implementering er ikke tilordnet noen referansevariabel, den har ikke noe navn og dermed Navnet Anonymt.

det er ikke nødvendig at begge klassene er i samme fil eller pakke. De kan være plassert hvor som helst i forhold til hverandre.

B. Implementer Av Grensesnitt
en anonym klasse kan også defineres som implementer av et grensesnitt.
i dette tilfellet vil det definere implementering av metoder deklarert i grensesnittet og kan sendes hvor som helst grensesnittet forventes.
Se under eksempel for å gjøre det klart.

interface WebInterface { // interface method declaration public void print();}class SearchEngine { // Notice the syntax WebInterface w = new WebInterface() { // Interface method implementation public void printName() { System.out.println("Website is codippa.com"); } }; // Expects an instance of WebInterface interface public void getWebsite(WebInterface web) { // call the method of WebInterface web.printName(); } // Main method public static void main(String args) { // create an object of this class SearchEngine obj = new SearchEngine(); // call its method and pass instance of WebInterface obj.getWebsite(obj.w); }}

som før kan implementering av grensesnitt som anonym klasse opprettes der det kreves som vist nedenfor.

public static void main(String args) { SearchEngine obj = new SearchEngine(); // Notice the implementation of WebInterface as argument obj.getWebsite(new WebInterface() { public void print() { System.out.println("Dynamic implementation"); } });}
Legg Merke til bruken av new nøkkelord før grensesnittnavnet. Anonym klasse er det eneste stedet der det er mulig.

Polymorfisme I Anonyme klasser
Som nevnt tidligere Følger Anonyme klasser Polymorfisme.
Siden de er underklasser, bør De følge Polymorfisme. Denne delen vil detaljere ut hvordan.
Vurder underklassen.

class Metal { public void printThickness() { System.out.println("Thick enough"); }}class MetalDriver { // Anonymous class definition Metal metal = new Metal() { public void printThickness() { System.out.println("Thick enough"); } // new method public boolean hasLustre() { return false; } }; public void printMetalDetail(Metal m) { // call method present in actual class definition. No problem!!! m.printThickness(); // call newly defined method in Anonymous class. Compiler Error!!! m.hasLustre(); }}

over koden definerer en klasse Metall med en enkelt metode.
denne klassen implementeres igjen anonymt i en annen klasse MetalDriver hvor en ny metode legges til sin definisjon som ikke er til stede i faktisk klasse.

nå når denne nye metoden kalles, klager kompilatoren med en feil

metoden hasLustre() er udefinert for Typen Metall.

dette skyldes at anonym klasse er en underklasse mens referansen er av faktisk klasse(som er overordnet).
Kompilatoren kunne ikke finne den nye metoden i overordnet klasse og flagger en feil.

dermed etablerer feilen to fakta:
(i) Anonym klasse er en underklasse av faktisk klasse, og
(ii) Anonyme klassedefinisjoner følger Polymorfisme.

bruk av anonym klasse
Anta at du må ringe en metode som tar et argument av en type som er et grensesnitt.
nå tilhører dette grensesnittet noe eksternt bibliotek, og du har ikke en klasse som implementerer dette grensesnittet.
Hvordan vil du kalle denne metoden. Hvis du passerer null, er det fare for kjøretidsunntak.
Anonym klasse til unnsetning.
Nå kan du opprette en anonym klasse som implementerer dette grensesnittet og gi det over metoden som gir implementering av metodene etter dine behov.
Eksempel følger.

// Interface from external Libraryinterface External { public void interfaceMethod();}class CalledClass { // Method to called. Takes an argument of interface type public void toBeCalled(External e) { e.interfaceMethod(); }}

over koden har et grensesnitt med en enkelt metode og en klasse hvis metode du må ringe fra koden din.

Metoden i denne klassen tar et argument av typen grensesnitt, men du har ikke en klasse som implementerer dette grensesnittet.
hvis du passerer null til metodeargumentet, vil det straks kaste en java.lang.NullPointerException.
Ta en titt på hvordan du kan ringe denne metoden Ved Hjelp Av Anonym klasse.

class CallingClass { // Main method public static void main(String args) { CalledClass obj = new CalledClass(); // call method using Anonymous class obj.toBeCalled(new External() { public void interfaceMethod() { // your code } }); }}

Legg Merke til Bruken Av Anonym grensesnitt implementering for å ringe metoden.
Dette er Den største fordelen Med Anonyme klasser.
4. Statisk nestet klasse
en statisk klasse som er definert i en annen klasse er en statisk nestet klasse. Det er definert akkurat som en vanlig klasse innledes med statisk søkeord.
Husk at det ikke er noe som statisk klasse, en statisk nestet klasse er bare et statisk medlem av sin ytre klasse.
Siden det er et statisk medlem, gjelder følgende for en statisk nestet klasse.

  1. den kan nås av den ytre klassen direkte uten å ha sin forekomst.
  2. Det kan bare få tilgang til statiske medlemmer av sin ytre klasse, men ikke dens instansvariabler eller metoder.

Eksempel På Statisk nestet klasse

public class Outer { // static nested class static class Inner { public void innerMethod() { System.out.println("Method of static nested class"); } } public void outerMethod() { System.out.println("Method of outer class"); } public static void main(String args) { // access inner class directly Inner inner = new Inner(); // call nested class method inner.innerMethod(); }}

som du kan se fra eksemplet ovenfor, er det ikke nødvendig med en forekomst av ytre klasse for å få tilgang til statisk nestet klasse.
merk at objekt av statisk nestet klasse ikke kan få tilgang til ikke-statiske medlemmer av ytre klasse. I eksemplet ovenfor kan nestet klasseforekomst ikke påberope outerMethod av ytre klasse.

la oss tweak i

  1. når en klasse som inneholder indre klasse er kompilert, genereres 2 klassefiler:
    en for ytre klasse og en for indre klasse.
    Eksempel Ytre.klasse Og Ytre$Indre.klasse for ytre klasse Ytre og indre klasse Indre henholdsvis..
  2. Klassefil av indre klasse kan ikke utføres direkte ved hjelp av java-kommandoen.
  3. en normal indre klasse kan ikke ha static datamedlemmer eller metoder.
  4. en indre klasse kan ha en konstruktør.
  5. en metode lokal klasse kan startes bare innenfor metoden der den er definert.
  6. en metode lokal klasse definert i static metode kan bare få tilgang til static medlemmer av den omsluttende klassen.
  7. en anonym klasse som implementerer et grensesnitt, kan implementere bare ett grensesnitt i motsetning til normale klasser som kan implementere mange.
  8. en anonym klasse kan ikke utvide en klasse og implementere et grensesnitt samtidig som normale klasser kan.
  9. Anonyme klassedefinisjoner slutter med}; (Legg Merke til semikolon).
  10. Anonyme klasser som er definert som et argument mens du kaller en metode, slutter med}); (Legg Merke til semikolon).
  11. du kan ikke ringe en metode pa anonym klassereferanse som ikke er til stede i faktisk klasse.
  12. en indre klasse foran med static er kjent som en nestet klasse, ikke en indre klasse.

Leave a Reply