1. Classi interne
Di recente hai appreso che esistono variabili statiche e metodi statici. Si scopre che ci sono anche classi statiche. Ma affronteremo questo argomento da lontano.
In Java, sei completamente autorizzato a dichiarare classi all'interno di classi. E anche classi all'interno di classi che sono all'interno di classi all'interno di classi. Sembra tutto molto semplice:
class OuterClass
{
variables of the class
methods of the class
class NestedClass
{
variables of the class
methods of the class
}
}
Dichiariamo semplicemente una classe all'interno di un'altra. Così semplice.
Esempio:
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;
}
}
Le classi annidate possono essere statiche o non statiche. Le classi nidificate statiche sono chiamate semplicemente classi nidificate statiche . Le classi nidificate non statiche sono chiamate classi interne ( inner classes ).
2. Classi statiche
Le classi nidificate statiche possono essere utilizzate al di fuori della loro classe esterna. Se tale classe ha il modificatore di accesso pubblico, può essere utilizzata ovunque nel programma. Tali classi sono quasi indistinguibili da qualsiasi classe ordinaria. Ma ci sono un paio di differenze.
Nome della classe
Se vuoi fare riferimento a una classe nidificata statica da un punto diverso dalla sua classe esterna, devi specificare il nome della classe, che consiste nel nome della classe esterna e nel nome della classe nidificata. Ecco l'aspetto generale di questo nome:
OuterClass.InnerClass
Esempi:
Classe esterna | Classe nidificata | Nome completo della classe nidificata |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Se una classe nidificata ha una propria classe nidificata, i loro nomi vengono semplicemente uniti usando un punto.
Un tipico esempio di una classe nidificata nel JDK è la Entry
classe all'interno della Map
classe. Se vuoi ottenere l'insieme di coppie chiave-valore memorizzate in un HashMap
oggetto, usa il entrySet()
metodo, che restituisce un file .Set<Map.Entry>
Si noti che è un esempio di una classe esterna e di una classe nidificata.Map.Entry
Creazione di un oggetto
È molto semplice creare un oggetto di una classe nidificata statica. Ecco come appare:
OuterClass.NestedClass name = new OuterClass.NestedClass();
È lo stesso delle classi ordinarie, ma il nome è composto da due parti.
Chiamare metodi statici
Se una classe statica ha metodi statici, puoi accedervi allo stesso modo dei metodi statici delle classi ordinarie (ma il nome della classe sarà composto da due parti).
OuterClass.NestedClass.staticMethod();
Accesso alle variabili statiche
Anche l'accesso alle variabili statiche pubbliche di una classe nidificata è facile:
OuterParent.NestedClass.nameOfStaticVariable
3. Caratteristiche delle classi statiche
Le classi nidificate statiche hanno il minimo motivo per essere chiamate statiche. Si comportano proprio come classi normali . Non ci sono restrizioni sull'accesso da metodi non statici.
Se stai lavorando con una classe annidata statica all'interno della sua classe esterna, non noterai alcuna differenza rispetto alla classe più ordinaria (non annidata e non statica).
Esempio:
Classe Point nidificata statica | Classe di punti ordinari. |
---|---|
|
|
Se prendi una classe nidificata statica e la sposti fuori dalla sua classe esterna, l'unica cosa che cambierà è che la nuova classe non sarà più in grado di accedere alle private static
variabili e ai metodi della sua precedente classe esterna.
Esempio:
Classe Point nidificata statica | Classe di punti ordinari. |
---|---|
|
|
Il main
metodo nella Point
classe ordinaria non può accedere alla private static
points
variabile della Solution
classe!
Questa è la principale differenza tra una classe nidificata statica e una classe ordinaria. I metodi di una classe nidificata statica possono accedere a tutte le variabili statiche e ai metodi della loro classe esterna, anche se sono dichiarati private
.
E se ci pensi, perché dovrebbe essere sorprendente? Il private
modificatore dice esplicitamente che è possibile accedere alle variabili e ai metodi contrassegnati da questo modificatore solo dall'interno della loro classe. Una classe nidificata statica è all'interno della sua classe esterna? Sì, quindi nessun problema! Accedili quanto vuoi.