Indlejrede klasser i Java

1. Introduktion

Denne tutorial er en hurtig og nøjagtig introduktion til indlejrede klasser på Java-sproget.

Kort sagt giver Java os mulighed for at definere klasser i andre klasser. Med indlejrede klasser kan vi logisk gruppere klasser, der kun bruges ét sted, skrive mere læsbar og vedligeholdelig kode og øge indkapslingen.

Før vi kommer i gang, skal vi se på de forskellige typer indlejrede klasser, der er tilgængelige på sproget:

  • Statisk indlejrede klasser
  • Ikke-statiske indlejrede klasser
  • Lokale klasser
  • Anonyme klasser

I de næste afsnit vil vi diskutere hver af disse detaljeret.

2. Statisk indlejrede klasser

Her er et par punkter at huske på statiske indlejrede klasser:

  • Som med statiske medlemmer hører disse til deres lukkede klasse og ikke til en forekomst af klassen
  • De kan have alle typer adgangsmodifikatorer i deres erklæring
  • De har kun adgang til statiske medlemmer i den indesluttende klasse
  • De kan definere både statiske og ikke-statiske medlemmer

Lad os se, hvordan vi kan erklære en statisk indlejret klasse:

offentlig klasse Omslutning {privat statisk int x = 1; offentlig statisk klasse StaticNested {private void run () {// metodeimplementering}} @ Test offentlig ugyldig test () {Enclosing.StaticNested nested = new Enclosing.StaticNested (); nested.run (); }}

3. Ikke-statisk indlejrede klasser

Dernæst er her et par hurtige punkter at huske på ikke-statiske indlejrede klasser:

  • De kaldes også indre klasser
  • De kan have alle typer adgangsmodifikatorer i deres erklæring
  • Ligesom instansvariabler og -metoder er indre klasser associeret med en forekomst af den indesluttende klasse
  • De har adgang til alle medlemmer af den indesluttende klasse, uanset om de er statiske eller ikke-statiske
  • De kan kun definere ikke-statiske medlemmer

Sådan kan vi erklære en indre klasse:

offentlig klasse Ydre {offentlig klasse Indre {// ...}}

Hvis vi erklærer en indlejret klasse med en modifikator statisk, så er det et statisk medlem. Ellers er det en indre klasse. Selvom forskellen syntaktisk kun er et enkelt nøgleord (dvs. statisk), der er semantisk en enorm forskel mellem disse slags indlejrede klasser. Forekomster af indre klasse er bundet til de indesluttende klasses, og derfor har de adgang til deres medlemmer. Vi skal være opmærksomme på dette problem, når vi vælger, om en indlejret klasse skal være en indre.

For at instantiere en indre klasse, skal vi først instantiere dens omgivende klasse.

Lad os se, hvordan vi kan gøre det:

Ydre ydre = ny Ydre (); Ydre.Indre indre = ydre. Ny indre ();

I de næste underafsnit vil vi vise nogle specielle typer indre klasser.

3.1. Lokale klasser

Lokale klasser er en særlig type indre klasser - hvor klassen er defineret inde i en metode eller omfangsblok.

Lad os se et par punkter at huske på denne type klasse:

  • De kan ikke have adgangsmodifikatorer i deres erklæring
  • De har adgang til både statiske og ikke-statiske medlemmer i den sammenhængende sammenhæng
  • De kan kun definere instansmedlemmer

Her er et hurtigt eksempel:

offentlig klasse NewEnclosing {void run () {class Local {void run () {// method implementation}} Local local = new Local (); local.run (); } @ Test offentlig ugyldig test () {NewEnclosing newEnclosing = ny NewEnclosing (); newEnclosing.run (); }}

3.2. Anonyme klasser

Anonyme klasser kan bruges til at definere en implementering af en grænseflade eller en abstrakt klasse uden at skulle oprette en genanvendelig implementering.

Lad os liste et par punkter, der skal huskes om anonyme klasser:

  • De kan ikke have adgangsmodifikatorer i deres erklæring
  • De har adgang til både statiske og ikke-statiske medlemmer i den sammenhængende sammenhæng
  • De kan kun definere instansmedlemmer
  • De er den eneste type indlejrede klasser, der ikke kan definere konstruktører eller udvide / implementere andre klasser eller grænseflader

For at definere en anonym klasse, lad os først definere en simpel abstrakt klasse:

abstrakt klasse SimpleAbstractClass {abstrakt ugyldigt løb (); }

Lad os nu se, hvordan vi kan definere en anonym klasse:

offentlig klasse AnonymousInnerUnitTest {@Test offentlig ugyldig nårRunAnonymousClass_thenCorrect () {SimpleAbstractClass simpleAbstractClass = ny SimpleAbstractClass () {ugyldig kørsel () {// metodeimplementering}}; simpleAbstractClass.run (); }}

For flere detaljer kan vi finde nyttige vores tutorial om anonyme klasser i Java.

4. Skygge

Erklæringen fra medlemmerne af en indre klasse skygger dem for den indesluttende klasse hvis de har samme navn.

I dette tilfælde er det her nøgleord refererer til forekomsterne af den indlejrede klasse, og medlemmerne af den ydre klasse kan henvises til ved hjælp af navnet på den ydre klasse.

Lad os se et hurtigt eksempel:

offentlig klasse NewOuter {int a = 1; statisk int b = 2; offentlig klasse InnerClass {int a = 3; statisk endelig int b = 4; offentlig ugyldig kørsel () {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 offentlig ugyldig test () {NewOuter ydre = ny NewOuter (); NewOuter.InnerClass indre = ydre. Ny InnerClass (); inner.run (); }}

5. Serialisering

For at undgå en java.io.NotSerializableException mens vi forsøger at serieisere en indlejret klasse, skal vi:

  • Erklær den indlejrede klasse som statisk
  • Lav både den indlejrede klasse og den vedlagte klasseimplement Serialiserbar

6. Konklusion

I denne artikel har vi set, hvad indlejrede klasser er, og deres forskellige typer. Vi kiggede også på, hvordan feltvisibilitet og adgangsmodifikatorer adskiller sig på tværs af disse forskellige typer.

Som altid kan den fulde implementering af denne vejledning findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found