Ugnježdeni razredi u Javi

1. Uvod

Ovaj je vodič brzi i precizan uvod u ugniježđene klase na jeziku Java.

Jednostavno rečeno, Java nam omogućuje definiranje klasa unutar drugih klasa. Ugnježđene klase omogućuju nam logično grupiranje klasa koje se koriste samo na jednom mjestu, pisanje čitljivijeg i održivijeg koda i povećanje enkapsulacije.

Prije nego što započnemo, pogledajmo nekoliko vrsta ugniježđenih klasa dostupnih na jeziku:

  • Statične ugniježđene klase
  • Nestatične ugniježđene klase
  • Lokalni razredi
  • Anonimni satovi

U sljedećim odjeljcima detaljno ćemo raspravljati o svakom od njih.

2. Statični ugniježđeni razredi

Evo nekoliko točaka koje treba zapamtiti o statičkim ugnježđenim klasama:

  • Kao i kod statičnih članova, oni pripadaju njihovoj zatvorenoj klasi, a ne instanci klase
  • U svojoj deklaraciji mogu imati sve vrste modifikatora pristupa
  • Oni imaju pristup samo statičkim članovima u razredu koji obuhvaća
  • Oni mogu definirati i statičke i nestatične članove

Pogledajmo kako možemo proglasiti statičku ugniježđenu klasu:

javna klasa Enclosing {private static int x = 1; javna statička klasa StaticNested {private void run () {// implementacija metode}} @Test test javne void () {Enclosing.StaticNested ugniježđeno = new Enclosing.StaticNested (); nested.run (); }}

3. Nestatične ugnježđene klase

Dalje, evo nekoliko brzih točaka koje treba zapamtiti o nestatičnim ugnježđenim klasama:

  • Oni se nazivaju i unutarnjim klasama
  • U svojoj deklaraciji mogu imati sve vrste modifikatora pristupa
  • Baš poput varijabli i metoda instance, unutarnje klase povezane su s instancom klase koja obuhvaća
  • Imaju pristup svim članovima klase koja ograđuje, bez obzira jesu li statični ili nestatični
  • Oni mogu definirati samo nestatične članove

Evo kako možemo proglasiti unutarnju klasu:

javni razred Vanjski {javni razred Unutarnji {// ...}}

Ako ugniježđenu klasu deklariramo s modifikatorom statički, onda je to statični član. Inače je to unutarnja klasa. Iako je sintaktički razlika samo jedna ključna riječ (tj. statički), semantički postoji velika razlika između ovih vrsta ugniježđenih klasa. Primjerci unutarnje klase vezani su uz one klase koji pripadaju i stoga imaju pristup svojim članovima. Morali bismo biti svjesni ovog problema prilikom odabira hoćemo li da ugniježđena klasa bude unutarnja.

Da bismo napravili instancu unutarnje klase, prvo moramo instantirati njezinu klasu koja obuhvaća.

Pogledajmo kako to možemo učiniti:

Vanjski vanjski = novi Vanjski (); Vanjski.Unutarnji unutarnji = vanjski.novi Unutarnji ();

U sljedećim pododjeljcima prikazat ćemo neke posebne vrste unutarnjih klasa.

3.1. Lokalni razredi

Lokalni razredi su posebna vrsta unutarnjih razreda - u kojima klasa je definirana unutar metode ili blok opsega.

Pogledajmo nekoliko točaka koje treba zapamtiti o ovoj vrsti nastave:

  • U svojoj deklaraciji ne mogu imati modifikatore pristupa
  • Imaju pristup i statičkim i ne-statičkim članovima u kontekstu koji se zatvara
  • Oni mogu definirati samo članove instance

Evo kratkog primjera:

javna klasa NewEnclosing {void run () {class Local {void run () {// implementacija metode}} Local local = new Local (); local.run (); } @Test javni void test () {NewEnclosing newEnclosing = new NewEnclosing (); newEnclosing.run (); }}

3.2. Anonimni razredi

Anonimne klase mogu se koristiti za definiranje implementacije sučelja ili apstraktne klase bez potrebe za izradom ponovne upotrebe.

Nabrojimo nekoliko točaka koje treba zapamtiti o anonimnim predavanjima:

  • U svojoj deklaraciji ne mogu imati modifikatore pristupa
  • Imaju pristup i statičkim i ne-statičkim članovima u kontekstu koji se zatvara
  • Oni mogu definirati samo članove instance
  • Oni su jedina vrsta ugniježđenih klasa koje ne mogu definirati konstruktore niti proširiti / implementirati druge klase ili sučelja

Da definiramo anonimnu klasu, definirajmo najprije jednostavnu apstraktnu klasu:

apstraktna klasa SimpleAbstractClass {abstract void run (); }

Sada da vidimo kako možemo definirati anonimnu klasu:

javna klasa AnonymousInnerUnitTest {@Test javna praznina kada jeRunAnonymousClass_thenCorrect () {SimpleAbstractClass simpleAbstractClass = nova SimpleAbstractClass () {void run () {// implementacija metode}}; simpleAbstractClass.run (); }}

Za više detalja možda će nam biti od koristi naš vodič o anonimnim tečajevima na Javi.

4. Sjenčanje

Izjava članova unutarnje klase zasjenjuje izjavu zatvorene klase ako imaju isto ime.

U ovom slučaju, ovaj Ključna riječ odnosi se na instance ugniježđene klase, a na članove vanjske klase može se uputiti pomoću naziva vanjske klase.

Pogledajmo brzi primjer:

javna klasa NewOuter {int a = 1; statički int b = 2; javna klasa InnerClass {int a = 3; statički konačni int b = 4; javna void run () {System.out.println ("a =" + a); System.out.println ("b =" + b); System.out.println ("NewOuterTest.this.a =" + NewOuter.this.a); System.out.println ("NewOuterTest.b =" + NewOuter.b); System.out.println ("NewOuterTest.this.b =" + NewOuter.this.b); }} @Test test javne praznine () {NewOuter external = new NewOuter (); NewOuter.InnerClass inner = external.new InnerClass (); unutarnji.run (); }}

5. Serijalizacija

Da bi se izbjegao a java.io.NotSerializableException dok pokušavamo serializirati ugniježđenu klasu, trebali bismo:

  • Proglasite ugniježđenu klasu kao statički
  • Neka i ugniježđena klasa i klasa koja obuhvaća implementiraju Serijalizirati

6. Zaključak

U ovom smo članku vidjeli što su ugniježđene klase i njihove različite vrste. Također smo pogledali kako se razlikuju modifikatori vidljivosti polja i pristupa za te različite tipove.

Kao i uvijek, cjelovitu implementaciju ovog vodiča možete pronaći na GitHubu.