1. Inre klasser
Du lärde dig nyligen att det finns statiska variabler och statiska metoder. Det visar sig att det också finns statiska klasser. Men vi kommer att närma oss detta ämne på avstånd.
I Java är du helt tillåten att deklarera klasser inom klasser. Och även klasser inom klasser som är inom klasser inom klasser. Det hela ser väldigt enkelt ut:
class OuterClass
{
variables of the class
methods of the class
class NestedClass
{
variables of the class
methods of the class
}
}
Vi deklarerar bara en klass i en annan. Så enkelt som det.
Exempel:
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;
}
}
Kapslade klasser kan vara statiska eller icke-statiska. Statiska kapslade klasser kallas helt enkelt statiska kapslade klasser . Icke-statiska kapslade klasser kallas inre klasser ( inre klasser ) .
2. Statiska klasser
Statiska kapslade klasser kan användas utanför deras yttre klass. Om en sådan klass har public access-modifieraren kan den användas var som helst i programmet. Sådana klasser går nästan inte att skilja från någon vanlig klass. Men det finns ett par skillnader.
Klassnamn
Om du vill referera till en statisk kapslad klass från någon annanstans än dess yttre klass, måste du ange klassnamnet, som består av namnet på den yttre klassen och namnet på den kapslade klassen. Här är det allmänna utseendet på detta namn:
OuterClass.InnerClass
Exempel:
Yttre klass | Kapslad klass | Fullständigt namn på den kapslade klassen |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Om en kapslad klass har sin egen kapslade klass sammanfogas deras namn helt enkelt med en punkt.
Ett typiskt exempel på en kapslad klass i JDK är Entry
klassen inuti Map
klassen. Om du vill få uppsättningen nyckel-värdepar lagrade i ett HashMap
objekt, använd entrySet()
metoden som returnerar en .Set<Map.Entry>
Observera att det är ett exempel på en yttre klass och en kapslad klass.Map.Entry
Skapa ett objekt
Det är väldigt enkelt att skapa ett objekt av en statisk kapslad klass. Så här ser det ut:
OuterClass.NestedClass name = new OuterClass.NestedClass();
Det är samma sak som med vanliga klasser, men namnet består av två delar.
Anropar statiska metoder
Om en statisk klass har statiska metoder kan du komma åt dem på samma sätt som de statiska metoderna för vanliga klasser (men klassnamnet kommer att bestå av två delar).
OuterClass.NestedClass.staticMethod();
Tillgång till statiska variabler
Det är också lätt att komma åt de offentliga statiska variablerna för en kapslad klass:
OuterParent.NestedClass.nameOfStaticVariable
3. Funktioner av statiska klasser
Statiska kapslade klasser har minst anledning att kallas statiska. De beter sig precis som vanliga klasser . Det finns inga begränsningar för att komma åt dem från icke-statiska metoder.
Om du arbetar med en statisk kapslad klass i dess yttre klass kommer du inte att märka någon skillnad från den vanligaste (inte kapslade och inte statiska) klassen.
Exempel:
Statisk kapslad punktklass | Vanlig poängklass. |
---|---|
|
|
Om du tar någon statisk kapslad klass och flyttar den från sin yttre klass, är det enda som kommer att förändras att den nya klassen inte längre kommer att kunna komma åt private static
variablerna och metoderna för sin tidigare yttre klass.
Exempel:
Statisk kapslad punktklass | Vanlig poängklass. |
---|---|
|
|
Metoden main
i den vanliga Point
klassen kan inte komma åt private static
points
klassens variabel Solution
!
Detta är huvudskillnaden mellan en statisk kapslad klass och en vanlig klass. Metoder för en statisk kapslad klass kan komma åt alla statiska variabler och metoder för deras yttre klass, även om de är deklarerade private
.
Och om du tänker efter, varför skulle det vara förvånande? Modifieraren private
säger uttryckligen att variablerna och metoderna markerade av denna modifierare endast kan nås från deras klass. Finns en statisk kapslad klass i dess yttre klass? Ja, så inga problem! Få tillgång till dem så mycket du vill.