Inner class in java

Inner class wat
betekent zoals de naam zegt, wordt een klasse binnen een andere klasse Een Inner Class genoemd.
Binnenklassen hebben een speciale relatie met de klasse die ze bevat, in die zin dat ze toegang heeft tot alle leden van de buitenklassen(zelfs private).
dit komt omdat een binnenklasse ook lid is van de buitenklasse, net als andere velden en methoden.
omdat een binnenklasse een klasse binnen een andere klasse is, kan het ook een geneste klasse worden genoemd.
typen binnenklassen
een binnenklasse kan de volgende typen hebben.

  1. normale of regelmatige of geneste Binnenklasse (gewoonlijk aangeduid als alleen binnenklasse)
  2. methode lokale Binnenklasse.
  3. anonieme Binnenklasse.
  4. statisch geneste klasse

1. Geneste Binnenklasse
deze sectie zal alle details van een binnenklasse onderzoeken. Neem voor de eenvoud de volgende klassen

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

hier is Outer de outer-klasse en Inner de inner-klasse die zich binnen Outer bevindt.

object van Binnenklasse
een binnenklasse bevindt zich binnen een andere klasse. Bevattende klasse wordt buitenklasse genoemd. Een innerlijke klasse kan dus niet bestaan zonder uiterlijke klasse en hetzelfde geldt voor zijn object (of instantie).
een object van binnenklasse kan niet bestaan zonder een object van buitenklasse.
dit betekent dat Voor het maken van een instance van inner class, je een instance van outer class nodig hebt.
dus, object van innerlijke klasse kan worden gemaakt door de hieronder gegeven methode.

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

om een object van binnenklasse te maken, is een object van buitenklasse nodig.
er is ook een korte-hand methode voor het maken van innerlijke klasse object.

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

Deze methode vereist ook object van de buitenklasse.
net Remember….An object van innerlijke klasse kan niet worden gemaakt zonder een object van zijn inhoud (of buitenste klasse).

Inner class Object aanmaken binnen Outer Class
vorig voorbeeld gaat ervan uit dat u inner class instanteert van ergens buiten de outer class.
maar in de meeste gevallen is een object van binnenklasse alleen vereist binnen de buitenklasse, omdat buitenklasse gebruik maakt van binnenklasse.
dus hoe creëren we een object van binnenklasse van binnen buitenklasse?
overweeg hieronder een aangepaste monsterklasse.

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

let op de regel Inner innerObject = new Inner();.
eerder werd gesteld dat een binnenklasse object niet kan worden gemaakt zonder een object van buitenklasse, maar het bovenstaande codefragment doet het wel. Verward !!!!
bovenstaande syntaxis is geldig omdat het geschreven is binnen een methode van de buitenste klasse.
wanneer deze code wordt uitgevoerd, is er al een instantie van outer class aanwezig, die de methode draait.

onthoud altijd dat, om een object van binnenklasse te maken(of toegang te krijgen), er een instantie van buitenklasse moet zijn.

samenvatten,

  1. wanneer een object van de binnenklasse wordt gemaakt vanuit de buitenklasse, kan het direct worden gemaakt als Inner innerObject = new Inner();.
  2. wanneer een object van binnenklasse wordt gemaakt van buiten de buitenklasse, moet het worden gemaakt als Inner innerObject = new Outer().new Inner();.

wanneer objecten van buiten-en binnenklasse worden afgedrukt, volgt de gegenereerde uitvoer:

Outer class instance: Outer@659e0bfd
Inner class instance : Outer$Inner@2a139a55

refererend naar Outer Class instance, fields and methods van Inner class
een inner class is ook een lid van zijn bevattende klasse zoals andere velden en methoden.
het heeft dus toegang tot andere velden en methoden van de buitenklasse op dezelfde manier als andere velden en methoden elkaar rechtstreeks benaderen.
dit geldt bij het benaderen van buitenklassevelden en methoden van binnenklasse.

maar wanneer de instantie van de buitenklasse wordt verwezen, is er een verschil. Om naar de huidige instantie van een klasse te verwijzen, wordt this trefwoord gebruikt.
in geval van binnenklasse verwijst het gebruik van this binnen binnenklasse naar het huidige exemplaar van binnenklasse en niet naar de buitenklasse.
voor het verwijzen naar een instantie van de buitenste klasse van de binnenste klasse, moeten we de klassenaam toevoegen aan this trefwoord.

dus gebruik Outer.this syntaxis om te verwijzen naar een instantie van de buitenste klasse van de binnenste klasse.
zie onderstaand voorbeeld voor begrip.

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

Output

Outer field: Outer
Inner instance:
Outer instance :

2. Methode Local Inner Class
zoals de naam al doet vermoeden, is een klasse gedefinieerd binnen een methode een methode Local Inner Class.
Ja, Het is mogelijk.
u kunt een klasse definiëren binnen een methode zoals hieronder getoond.

// 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}

bovenstaande code heeft een klasse buitenkant die een methode bevat.
deze methode definieert een klasse die zich binnen het lichaam van de methode bevindt, vandaar de naam method local inner class.
merk op dat Inner class ook zijn eigen methode definitie heeft.

Instantiating a Method local inner class
previous code declareert een method local inner class, maar het creëert geen object van inner class.
nu rijst de vraag, hoe een object van methode lokale innerlijke klasse te creëren.
omdat een methode lokale binnenklasse binnen een methode is gedefinieerd, is het alleen zichtbaar binnen die methode en kan het object ook alleen binnen die methode worden gemaakt.
onderstaande code maakt een object van methode lokale innerlijke klasse en roept zijn methode.

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

wanneer de bovenstaande code wordt uitgevoerd, volgt de uitvoer

methode lokale inner class methode genaamd

Dit toont aan dat wanneer de outer class methode wordt aangeroepen, het een object van inner class creëert en de inner class methode aanroept.

Method Local Inner Class: punten om te onthouden
Statement dat een object maakt van method local inner class moet buiten het klasselichaam worden geschreven.
dus, de regel Inner innerObject = new Inner(); moet komen nadat de lokale klasse eindigt.

  1. een methode lokale binnenklasse kan alleen worden geïnstantieerd binnen de methode waarin zij wordt gedeclareerd.
    dit is logisch omdat een methodeklasse alleen zichtbaar is binnen de methode, dus het object ervan kan alleen binnen die methode worden gemaakt.
  2. een methode lokale binnenklasse kan geen toegang krijgen tot de lokale variabelen van de methode waarin het wordt gedeclareerd.
    als het toegang nodig heeft, moeten ze gemarkeerd worden als final.
    dit is van toepassing voor java 8.
  3. u kunt geen toegang krijgen tot een method local variabele binnen een method local inner class en deze vervolgens opnieuw toewijzen. Dit zal een compilerfout zijn.
    dit is van toepassing vanaf java 8 omdat versies voorafgaand aan java 8 je zelfs geen toegang geven tot een methode lokale variabele binnen de innerlijke klasse.
  4. een methode lokale binnenklasse heeft toegang tot de velden en andere methoden van de klasse waartoe de methode die binnenklasse bevat behoort.
  5. een methode lokale binnenklasse heeft alleen toegang tot de static velden en andere static methoden van de klasse waartoe de methode die binnenklasse bevat behoort wanneer de methode die binnenklasse bevat staticis.

3. Anonieme Binnenklassen
anoniem betekent waarvan de naam niet bekend is. In de context van java is een anonieme Klasse er een die geen naam heeft.
de term anonieme klasse is alleen van toepassing op Binnenklassen omdat buitenklassen een naam moeten hebben.
een anonieme klasse is een interne klasse omdat deze altijd binnen een andere klasse gedefinieerd zal worden.

types of anonymous class in java
in actual is een anonieme class een implementatie van een reeds bestaande class of een interface die ergens anders geschreven is, maar die opnieuw gedefinieerd wordt binnen een andere class zoals vereist.
dit klinkt misschien verwarrend, maar de volgende voorbeelden zullen het begrip verduidelijken.

gebaseerd op het feit of de anonieme Klasse Een implementatie van een klasse of een interface is, kan deze tot de volgende twee categorieën behoren

A. Subklasse van een klasse
laten we beginnen met een voorbeeld eerst

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

in het bovenstaande voorbeeld is er een klasse genaamd Website die al is aangemaakt.
een andere class SearchEngine herdefinieert deze klasse, implementeert haar methode en kent deze toe aan een referentievariabele die van hetzelfde type is als de werkelijke class.
het is ook mogelijk om de nieuw geà mplementeerde methode aan te roepen met behulp van deze referentievariabele.

onthoud dat de Nieuw geà mplementeerde anonieme klasse een subklasse is van de werkelijke klasse.
het volgt polymorfisme en het object kan overal worden doorgegeven waar het object van de websiteklasse wordt verwacht.
neem het onderstaande voorbeeld voor illustratie.

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

in plaats van de implementatie van de websiteklasse vooraf te definiëren, kan deze waar nodig worden gedefinieerd, dat wil zeggen tijdens het aanroepen van de getwebsite-methode.
de hoofdmethode kan dus worden gewijzigd als

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

de bovenstaande implementatie is niet toegewezen aan een referentievariabele, het heeft geen naam en dus de naam Anonymous.

het is niet nodig dat beide klassen zich in hetzelfde bestand of pakket bevinden. Ze kunnen overal ten opzichte van elkaar worden gelokaliseerd.

B. implementatie van Interface
een anonieme klasse kan ook worden gedefinieerd als de implementatie van een interface.
in dit geval definieert het de implementatie van de in de interface gedeclareerde methoden en kan overal worden doorgegeven waar het object van de interface wordt verwacht.
zie onderstaand voorbeeld om dit duidelijk te maken.

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

Zoals hiervoor, kan de implementatie van interface als anonieme klasse worden gemaakt waar nodig, zoals hieronder getoond.

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"); } });}
let op het gebruik van new sleutelwoord vóór de interfacenaam. Anonieme klasse is de enige plek waar het mogelijk is.

polymorfisme in anonieme klassen
zoals eerder vermeld, volgen anonieme klassen polymorfisme.
omdat het subklassen zijn, moeten ze polymorfisme volgen. Deze sectie zal gedetailleerd uit te leggen hoe.
beschouw de onderstaande klasse.

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

bovenstaande code definieert een klasse metaal met een enkele methode.
deze klasse wordt opnieuw anoniem geïmplementeerd in een andere klasse MetalDriver waar een nieuwe methode aan de definitie wordt toegevoegd die niet aanwezig is in de werkelijke klasse.

wanneer deze nieuwe methode wordt aangeroepen, klaagt de compiler met een fout

de methode hasLustre () is niet gedefinieerd voor het type Metal.

Dit komt omdat de anonieme klasse een subklasse is terwijl de referentie van de werkelijke klasse is (die de ouder is).
Compiler kon de nieuwe methode niet vinden in bovenliggende klasse en markeert een fout.

de fout stelt dus twee feiten vast:
(I) anonieme klasse is een subklasse van de werkelijke klasse, en
(ii) anonieme klassendefinities volgen polymorfisme.

gebruik van anonieme klasse
stel dat u een methode moet aanroepen die een argument neemt van een type dat een interface is.
nu, deze interface behoort tot een externe bibliotheek en je hebt geen klasse die deze interface implementeert.
hoe noemt u deze methode. Als u null passeert, bestaat het risico van uitzonderingen op de looptijd.
anonieme klasse te hulp.
nu kunt u een anonieme klasse maken die deze interface implementeert en deze doorgeven aan de methode die de implementatie van zijn methoden biedt volgens uw behoeften.
voorbeeld volgt.

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

bovenstaande code heeft een interface met een enkele methode en een klasse waarvan u de methode moet aanroepen vanuit uw code.

methode van deze klasse heeft een argument van het type interface, maar u hebt geen klasse die deze interface implementeert.
als u null doorgeeft aan het methodeargument, zal het meteen een java.lang.NullPointerExceptiongooien.
kijk hoe u deze methode kunt aanroepen met behulp van anonieme 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 } }); }}

let op het gebruik van anonieme interface-implementatie om de methode aan te roepen.
Dit is het grootste voordeel van anonieme klassen.
4. Statische geneste klasse
een statische klasse die binnen een andere klasse is gedefinieerd, is een statische geneste klasse. Het wordt gedefinieerd net als een normale klasse voorafgegaan door een statisch trefwoord.
onthoud dat er niets is als statische klasse, een statische geneste klasse is gewoon een statisch lid van zijn buitenste klasse.
omdat het een statisch lid is, wordt het volgende toegepast op een statisch geneste klasse.

  1. het kan worden benaderd door de buitenste klasse direct zonder zijn instantie.
  2. het heeft alleen toegang tot statische leden van zijn buitenste klasse, maar niet tot zijn instance variabelen of methoden.

statisch geneste klasse voorbeeld

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

Zoals u kunt zien in het bovenstaande voorbeeld, dat om toegang te krijgen tot statisch geneste klasse, een instantie van buitenklasse niet vereist is en direct toegankelijk is.
merk op dat object van statische geneste Klasse geen toegang heeft tot niet-statische leden van de buitenste klasse. In het bovenstaande voorbeeld kan geneste class instantie outerMethod van outer class niet aanroepen.

laten we tweaken in

  1. wanneer een klasse die binnenklasse bevat gecompileerd is, dan worden 2 klasse-bestanden gegenereerd :
    een voor buitenklasse en een voor binnenklasse.
    Voorbeeld, Outer.klasse en buitenste $ Inner.klasse voor buitenklasse Buitenklasse en binnenklasse Binnenklasse..
  2. Klasse-bestand van innerlijke klasse kan niet direct worden uitgevoerd met behulp van java-Commando.
  3. een normale binnenklasse kan geen static gegevensleden of-methoden hebben.
  4. een binnenklasse kan een constructor hebben.
  5. een methode lokale klasse kan worden geïnstantieerd alleen binnen de methode waarin het is gedefinieerd.
  6. een methode lokale klasse gedefinieerd in static methode kan alleen static leden van de enclosing klasse benaderen.
  7. een anonieme klasse die een interface implementeert, kan slechts één interface implementeren in tegenstelling tot normale klassen die veel kunnen implementeren.
  8. een anonieme klasse kan een klasse niet uitbreiden en tegelijkertijd een interface implementeren die normale klassen wel kunnen.
  9. anonieme klassendefinities eindigen op}; (let op de puntkomma).
  10. anonieme klassen die gedefinieerd zijn als een argument tijdens het aanroepen van een methode eindigen met}); (Let op de puntkomma).
  11. u kunt geen methode aanroepen op anonieme klasseverwijzing die niet aanwezig is in de werkelijke klasse.
  12. een binnenklasse voorafgegaan door static staat bekend als een geneste klasse, niet als een binnenklasse.

Leave a Reply