1. Indre klasser
Du har for nylig lært, at der er statiske variable og statiske metoder. Det viser sig, at der også er statiske klasser. Men vi vil nærme os dette emne på afstand.
I Java har du helt lov til at erklære klasser inden for klasser. Og endda klasser inden for klasser, der er inden for klasser inden for klasser. Det hele ser meget simpelt ud:
class OuterClass
{
variables of the class
methods of the class
class NestedClass
{
variables of the class
methods of the class
}
}
Vi erklærer bare en klasse i en anden. Så simpelt som det.
Eksempel:
public class Solution
{
static ArrayList<Point> points = new ArrayList<Point>();
public static void main(String[] args)
{
Point point = new Point();
point.x = 100;
point.y = 200;
points.add(point);
}
static class Point
{
int x;
int y;
}
}
Indlejrede klasser kan være statiske eller ikke-statiske. Statiske indlejrede klasser kaldes simpelthen statiske indlejrede klasser . Ikke-statiske indlejrede klasser kaldes indre klasser ( indre klasser ).
2. Statiske klasser
Statiske indlejrede klasser kan bruges uden for deres ydre klasse. Hvis en sådan klasse har public access modifier, så kan den bruges hvor som helst i programmet. Sådanne klasser kan næsten ikke skelnes fra nogen almindelig klasse. Men der er et par forskelle.
Klassenavn
Hvis du vil henvise til en statisk indlejret klasse fra et andet sted end dens ydre klasse, skal du angive klassenavnet, som består af navnet på den ydre klasse og navnet på den indlejrede klasse. Her er det generelle udseende af dette navn:
OuterClass.InnerClass
Eksempler:
Ydre klasse | Indlejret klasse | Fulde navn på den indlejrede klasse |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Hvis en indlejret klasse har sin egen indlejrede klasse, sammenføjes deres navne simpelthen ved hjælp af en prik.
Et typisk eksempel på en indlejret klasse i JDK er Entry
klassen inde i Map
klassen. Hvis du ønsker at få sættet af nøgleværdi-par gemt i et HashMap
objekt, så brug entrySet()
metoden, som returnerer en .Set<Map.Entry>
Bemærk, at det er et eksempel på en ydre klasse og en indlejret klasse.Map.Entry
Oprettelse af et objekt
Det er meget nemt at oprette et objekt af en statisk indlejret klasse. Sådan ser det ud:
OuterClass.NestedClass name = new OuterClass.NestedClass();
Det er det samme som med almindelige klasser, men navnet består af to dele.
Kalder statiske metoder
Hvis en statisk klasse har statiske metoder, kan du få adgang til dem på samme måde som de statiske metoder i almindelige klasser (men klassenavnet vil bestå af to dele).
OuterClass.NestedClass.staticMethod();
Adgang til statiske variabler
Det er også nemt at få adgang til de offentlige statiske variabler i en indlejret klasse:
OuterParent.NestedClass.nameOfStaticVariable
3. Funktioner af statiske klasser
Statiske indlejrede klasser har den mindste grund til at blive kaldt statiske. De opfører sig ligesom almindelige klasser . Der er ingen begrænsninger for at få adgang til dem fra ikke-statiske metoder.
Hvis du arbejder med en statisk indlejret klasse inde i dens ydre klasse, vil du ikke bemærke nogen forskel fra den mest almindelige (ikke indlejrede og ikke statiske) klasse.
Eksempel:
Statisk indlejret punktklasse | Almindelig punktklasse. |
---|---|
|
|
Hvis du tager en statisk indlejret klasse og flytter den ud af dens ydre klasse, er det eneste, der vil ændre sig, at den nye klasse ikke længere vil være i stand til at få adgang til private static
variablerne og metoderne fra dens tidligere ydre klasse.
Eksempel:
Statisk indlejret punktklasse | Almindelig punktklasse. |
---|---|
|
|
Metoden main
i den almindelige Point
klasse kan ikke få adgang til private static
points
klassens variable Solution
!
Dette er hovedforskellen mellem en statisk indlejret klasse og en almindelig klasse. Metoder i en statisk indlejret klasse kan få adgang til alle statiske variabler og metoder i deres ydre klasse, selvom de er erklæret private
.
Og hvis du tænker over det, hvorfor skulle det så være overraskende? Modifikatoren private
siger eksplicit, at de variabler og metoder, der er markeret med denne modifikator, kun kan tilgås fra deres klasse. Er en statisk indlejret klasse inde i dens ydre klasse? Ja, så intet problem! Få adgang til dem så meget du vil.
GO TO FULL VERSION