Corso di Java

Variabili e metodi di classe

 

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 l’istruzione 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 l’intera 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.
L’esempio 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())
Quest’ultimo è 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, l’esecuzione dell’istruzione:

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 l’esecuzione 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 l’oggetto 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 un’area 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 dell’oggetto sul quale l’operazione è stata eseguita, senza influire sulle copie delle altre istanze.
Nel caso di una variabile statica, l’area di memoria in cui essa è memorizzata viene condivisa da tutte le istanze della classe, cosicché se una di esse ne modifica il valore, l’operazione avrà ripercussione anche sulle altre.

 

Torna all'indice Generale del corso di Corso di Java di Software Planet