Da Vedere Metodi variabili statiche Java :
- È una variabile che appartiene alla classe e non all'oggetto (istanza)
- Le variabili statiche vengono inizializzate una sola volta, all'inizio dell'esecuzione. Queste variabili verranno inizializzate per prime, prima dell'inizializzazione di qualsiasi variabile di istanza
- Una singola copia da condividere da tutte le istanze della classe
- È possibile accedere a una variabile statica direttamente dal nome della classe e non necessita di alcun oggetto.
Le variabili di istanza e di classe (statiche) vengono inizializzate automaticamente ai valori predefiniti standard se non vengono inizializzate di proposito. Sebbene le variabili locali non vengano inizializzate automaticamente, non è possibile compilare un programma che non riesce a inizializzare una variabile locale o ad assegnare un valore a quella variabile locale prima che venga utilizzata.
Ciò che il compilatore effettivamente fa è produrre internamente una singola routine di inizializzazione della classe che combina tutti gli inizializzatori di variabili statiche e tutti i blocchi di codice degli inizializzatori statici, nell'ordine in cui appaiono nella dichiarazione della classe. Questa singola procedura di inizializzazione viene eseguita automaticamente, una sola volta, al primo caricamento della classe.
In caso di classi interne , non possono avere campi statici
Una classe interna è una classe nidificata che non è dichiarata esplicitamente o implicitamente static
.
...
Le classi interne non possono dichiarare inizializzatori statici (§8.7) o interfacce membro ...
Le classi interne non possono dichiarare membri statici, a meno che non siano variabili costanti ...
Vedere JLS 8.1.3 Classi interne e istanze di contenimento
final
i campi in Java possono essere inizializzati separatamente dalla loro posizione di dichiarazione, ma non può essere applicabile ai static final
campi. Vedi l'esempio sotto.
final class Demo
{
private final int x;
private static final int z;
static
{
z = 10;
}
public Demo(int x)
{
this.x=x;
}
}
Questo perché c'è solo una copia delle static
variabili associate al tipo, piuttosto che una associata a ciascuna istanza del tipo come con le variabili di istanza e se proviamo a inizializzare il z
tipo static final
all'interno del costruttore, tenterà di reinizializzare il static final
campo del tipo z
perché il costruttore viene eseguito su ogni istanza della classe che non deve ricorrere ai final
campi statici .