L'informatico di Schrödinger

cat
28Jan/11Off

Java: Programmazione ad Oggetti (Parte 2: Static)

In questo articolo riprendiamo da dove ci eravamo lasciati l'ultima volta e arricchiamo di qualche nuovo concetto le nostre conoscenze sulla programmazione ad oggetti in Java.

Abbiamo già visto come definire una classe, istanziare un oggetto della stessa, e come manipolarlo tramite i suoi metodi di istanza: adesso introdurremo il concetto di metodi e variabili di classe.

Come abbiamo visto ciascun oggetto - di una determinata classe - da noi creato può essere descritto in base al contenuto delle sue variabili di istanza: esse ne rappresentano in qualche modo lo "stato" e ogni istanza di una classe ha accesso solo ed esclusivamente alle informazioni in salvate nelle sue variabili.

Allo stesso modo i metodi di istanza di un oggetto possono, tramite il riferimento a "this", accedere\lavorare sulle variabili di istanza dello specifico oggetto su cui sono invocati.

Ora può sorgere una domanda più che legittima: "Se ho necessità di avere un informazione condivisa da tutte le istanze di una determinata classe come posso fare?"

Facciamo un esempio classico riprendendo la classe Persona esaminata nell'articolo precedente.
Una necessità che si presenta spesso è quella di assegnare un id numerico progressivo ad ogni istanza che vado a creare di una classe (in buona sostanza un contatore di istanze): per fare ciò la cosa sensata che mi aspetto di poter fare è salvare in una variabile un valore numerico che andrò a incrementare ogni volta che creo un nuovo oggetto di quella classe.

Tale variabile "logicamente" è una variabile che deve essere leggibile a tutti gli oggetti di una determinata classe e non solo ad una singola istanza poiché, in un certo qual modo, rappresenta lo "stato" dell'intera classe.

Ovviamente non potrò quindi usare le variabili di istanza. In questo caso useremo una variabile di classe.

Le variabili di classe (variabili "statiche") possono essere definite allo stesso modo in cui definiamo le rispettive variabili di istanza: l'unica accortezza consiste di anteporre alla dichiarazione la keywork "static".

1
static tipo nome_variabile;

Evitando di riportare l'intero codice della classe Persona potremmo apportare le seguenti modifiche per introdurre un contatore di istanze:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static int count = 0;
int id;
 
public Persona(){
    count++;
    this.id = count;
}
 
public Persona(String nome,String cognome, int eta){
    this.nome=nome;
    this.cognome=cognome;
    this.eta=eta;
    count++;
    this.id = count;
}
 
public int getId(){
    return this.id;
}

Come è possibile notare la variabile "count" viene incrementata ogni volta che una nuova istanza della classe viene inizializzata tramite la chiamata al costruttore.
Il metodo getId() restituisce l'id del singolo oggetto: il valore che assume tale variabile (di istanza) è legato al numero complessivo di oggetti istanziati al momento della chiamata del costruttore (valore che come abbiamo detto è salvato nella variabile "di classe" count).

Vediamo adesso come il concetto può essere esteso ai metodi.
Il modificatore "static" può essere associato ad i metodi descritti in una classe (ne abbiamo già visto un esempio nel caso del metodo main(String[] args) ): il significato semantico espresso in tale caso è abbastanza chiaro. Definire un metodo statico consente di poter invocare lo stesso senza istanziare un oggetto della classe che lo definisce. I metodi statici non sono infatti legati alla singola istanza della classe quanto alla classe stessa.

Poniamo il caso di dover definire un metodo che ritorni il numero attuale di oggetti della classe Persona attualmente istanziati, scriveremo:

1
2
3
public static int getCount(){
    return count;
}

Come è facile intuire all'interno di un metodo statico non è possibile accedere alle variabili di istanza (anche la keyword "this" perde di significato, non è infatti utilizzabile) mentre è pratica comune accedere quelle di classe.

Come invoco questo metodo senza istanziare un oggetto della classe Persona?
Questa è una domanda sensata. Non essendo legati ad una specifica istanza il metodo più naturale (e corretto) per invocare metodi statici è quello di invocarli sulla classe stessa.
Scriveremo quindi, nel nostro caso:

1
int totalePersone = Persona.getCount();

Adesso possiamo dire di avere le basi necessarie per poter affrontare argomenti un po' più complessi: nel prossimo articolo si introdurrà, ovviamente senza entrare nei dettagli considerando il taglio introduttivo dato alla trattazione sino ad ora, il significato dei modificatori di visibilità (per metodi e variabili) espressi dalle keyword "public", "private" e "protected". Nel fare ciò si introdurrà il concetto di "package".

Enhanced by Zemanta
Comments (0) Trackbacks (0)

Sorry, the comment form is closed at this time.

Trackbacks are disabled.