Normalmente, quando creiamo una classe, descriviamo come saranno
gli oggetti di quella classe e quale sarà il loro comportamento,
ma perché gli attributi e i metodi di un oggetto diventino disponibili
è necessario crearlo mediante listruzione new.
Esistono, tuttavia, due situazioni in cui questo approccio non è
sufficiente:
1. quando si vogliono memorizzare delle informazioni indipendentemente
dal numero di oggetti creati o anche se non è stato creato alcun
oggetto;
2. quando si vuole utilizzare un metodo che non è associato con
nessun oggetto particolare della classe.
Per risolvere questo problema è possibile utilizzare la parola chiave
static, che permette di non collegare la variabile o il metodo
ad una particolare istanza della classe, cosicché è possibile invocare
quel metodo o accedere a quella variabile anche se non è stato mai
creato un oggetto di quella classe.
Si utilizzano i termini variabili di classe e metodi di
classe per indicare che tali variabili e metodi esistono per
lintera classe e non per il particolare oggetto della classe.
Per rendere statico un attributo o un metodo, occorre semplicemente
anteporre la parola chiave static alla definizione.
Lesempio seguente è una classe con un attributo ed un metodo
statici:
class EsempioStatic {
static public int i = 15;
static public void incrementa() {
i = i + 1;
}
public void stampa() {
System.out.println(Il valore di i e: +
i);
}
}
Se adesso creiamo due oggetti di questa classe:
EsempioStatic es1 = new
EsempioStatic();
EsempioStatic es2 = new EsempioStatic();
entrambi condivideranno la stessa variabile i e sia es1.i
che es2.i avranno lo stesso valore.
Esistono due modi per riferire una variabile o un metodo di tipo
static:
1. utilizzando il nome di un oggetto della classe (ad esempio es1.i);
2. utilizzando direttamente il nome della classe (ad esempio EsempioStatic.incrementa())
Questultimo è preferibile, perché ne enfatizza la natura statica.
Aggiungiamo alla precedente classe il seguente metodo:
public static void main(String
args[]) {
EsempioStatic es1 = new EsempioStatic();
EsempioStatic es2 = new EsempioStatic();
es1.stampa();
es2.stampa();
EsempioStatic.incrementa();
es1.stampa();
es2.stampa();
}
ed esaminiamone le operazioni compiute.
Per prima cosa vengono dichiarati e creati due oggetti della classe
EsempioStatic, poi viene invocato su ciascuno di essi
il metodo stampa(), viene invocato il metodo statico incrementa()
direttamente sulla classe e poi nuovamente il metodo stampa().
Dal prompt del Dos (per Windows) o dalla shell (per Linux), compiliamo
la classe con il comando:
javac EsempioStatic.java
e richiamiamo la macchina virtuale Java con il comando:
java EsempioStatic
Otterremo in output le seguenti righe:
Il valore di i e': 15
Il valore di i e': 15
Il valore di i e': 16
Il valore di i e': 16
Come possiamo vedere, lesecuzione dellistruzione:
EsempioStatic.incrementa();
ha avuto ripercussioni su entrambi gli oggetti es1 ed es2.
Per capire pienamente come viene ottenuto questo risultato, occorre
guardare più profondamente come lavora Java.
Abbiamo detto che una variabile è un elemento in cui è possibile
memorizzare informazioni di vario tipo durante lesecuzione
di un programma; perché ciò possa realizzarsi, è necessario che
tali informazioni vengano memorizzate da qualche parte nella memoria
del computer.
Quando viene creato un oggetto, Java pensa automaticamente ad
allocare per esso la memoria necessaria a contenere i suoi attributi,
più altre informazioni per gestire loggetto a basso livello
(nulla di cui si debba preoccupare il programmatore).
Se vengono creati due oggetti di una stessa classe, ad ognuno di
essi sarà assegnata unarea di memoria dedicata, contente una
copia personale di tutte le variabili non statiche dichiarate nella
classe. Se si modifica una variabile istanza, il nuovo valore sarà
assegnato solo alla copia delloggetto sul quale loperazione
è stata eseguita, senza influire sulle copie delle altre istanze.
Nel caso di una variabile statica, larea di memoria in cui
essa è memorizzata viene condivisa da tutte le istanze della classe,
cosicché se una di esse ne modifica il valore, loperazione
avrà ripercussione anche sulle altre.
Torna all'indice Generale del corso di Corso di Java di Software Planet