1. Innerlijke klassen
U heeft onlangs vernomen dat er statische variabelen en statische methoden zijn. Het blijkt dat er ook statische klassen zijn. Maar we zullen dit onderwerp van een afstand benaderen.
In Java is het volledig toegestaan om klassen binnen klassen te declareren. En zelfs klassen binnen klassen die binnen klassen binnen klassen zijn. Het ziet er allemaal heel simpel uit:
class OuterClass
{
variables of the class
methods of the class
class NestedClass
{
variables of the class
methods of the class
}
}
We declareren gewoon de ene klasse in de andere. Zo simpel is het.
Voorbeeld:
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;
}
}
Geneste klassen kunnen statisch of niet-statisch zijn. Statische geneste klassen worden eenvoudigweg statische geneste klassen genoemd . Niet-statische geneste klassen worden innerlijke klassen ( inner classs ) genoemd .
2. Statische lessen
Statische geneste klassen kunnen buiten hun buitenste klasse worden gebruikt. Als een dergelijke klasse de modifier voor openbare toegang heeft, kan deze overal in het programma worden gebruikt. Dergelijke klassen zijn bijna niet te onderscheiden van een gewone klasse. Maar er zijn een paar verschillen.
Naam van de klasse
Als u wilt verwijzen naar een statische geneste klasse van ergens anders dan de buitenste klasse, moet u de klassenaam specificeren, die bestaat uit de naam van de buitenste klasse en de naam van de geneste klasse. Dit is het algemene uiterlijk van deze naam:
OuterClass.InnerClass
Voorbeelden:
Buitenste klasse | Geneste klasse | Volledige naam van de geneste klasse |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Als een geneste klasse zijn eigen geneste klasse heeft, worden hun namen eenvoudigweg samengevoegd met een punt.
Een typisch voorbeeld van een geneste klasse in de JDK is de Entry
klasse binnen de Map
klasse. Als u de set sleutel-waardeparen in een object wilt opslaan HashMap
, gebruikt u de entrySet()
methode die een retourneert .Set<Map.Entry>
Merk op dat dit een voorbeeld is van een buitenste klasse en een geneste klasse.Map.Entry
Een voorwerp maken
Het is heel eenvoudig om een object van een statische geneste klasse te maken. Zo ziet het eruit:
OuterClass.NestedClass name = new OuterClass.NestedClass();
Het is allemaal hetzelfde als bij gewone klassen, maar de naam bestaat uit twee delen.
Statische methoden aanroepen
Als een statische klasse statische methoden heeft, kunt u deze op dezelfde manier benaderen als de statische methoden van gewone klassen (maar de klassenaam bestaat uit twee delen).
OuterClass.NestedClass.staticMethod();
Toegang tot statische variabelen
Toegang krijgen tot de openbare statische variabelen van een geneste klasse is ook eenvoudig:
OuterParent.NestedClass.nameOfStaticVariable
3. Kenmerken van statische klassen
Statische geneste klassen hebben de minste reden om statisch genoemd te worden. Ze gedragen zich net als gewone klassen . Er zijn geen beperkingen voor toegang via niet-statische methoden.
Als u werkt met een statische geneste klasse binnen de buitenste klasse, merkt u geen verschil met de meest gewone (niet geneste en niet statische) klasse.
Voorbeeld:
Statisch geneste Point-klasse | Gewone Point-klasse. |
---|---|
|
|
Als je een statische geneste klasse neemt en deze uit de buitenste klasse haalt, is het enige dat verandert dat de nieuwe klasse niet langer toegang heeft tot de private static
variabelen en methoden van de vorige buitenste klasse.
Voorbeeld:
Statisch geneste Point-klasse | Gewone Point-klasse. |
---|---|
|
|
De main
methode in de gewone Point
klasse heeft geen toegang tot de private static
points
variabele van de Solution
klasse!
Dit is het belangrijkste verschil tussen een statische geneste klasse en een gewone klasse. Methoden van een statische geneste klasse hebben toegang tot alle statische variabelen en methoden van hun buitenste klasse, zelfs als ze gedeclareerd zijn private
.
En als je erover nadenkt, waarom zou dat verrassend zijn? De private
modifier zegt expliciet dat de variabelen en methoden gemarkeerd door deze modifier alleen toegankelijk zijn vanuit hun klasse. Is een statische geneste klasse binnen de buitenste klasse? Ja, dus geen probleem! Krijg er zoveel toegang toe als je wilt.
GO TO FULL VERSION