  |
Quando uso un campo mi riferisco alla istanza corrente |
Una volta che ho definito una classe, posso creare diverse istanze
della classe, e sono tutte diverse. Come dire, una volta che ho
progettato una automobile posso realizzarne diverse utilizzando lo
stesso progetto. O come dire che una volta creata una forma per i
calchi in gesso, di calchi se ne possono realizzare
innumerevoli. Tuttavia ogni istanza ha i suoi campi e i suoi metodi. E
i metodi fanno riferimento ai campi. Ovviamente si vuole che un metodo
faccia riferimento ai campi della particolare istanza. Il problema è:
come legare i campi ai metodi? Qualcuno potrebbe pensare a qualche
misterioso legame con sistemi nascosti che tengono traccia in maniera
complicata di queste informazioni. Niente di tutto questo:
l'associazione tra campi e metodi viene fatta invece dall'utilizzatore
dell'oggeto. Vediamo come.
  |
Consideriamo una semplice classe |
class Num {
int n;
Num (int num) {
n = num;
}
}
La classe più semplice che possiamo immaginare (a parte quella
degenere, senza campi, che non fa nulla) è quella con un solo campo,
mostrata nel listato precedente. Queste classi sono utili: per esempio
la classe Integer di sistema di Java è simile a questa. È quello che
si chiama una classe "pacco" (wrapper), non nel senso che rifila un
bidone, ma nel senso che impacchetta in un oggetto un tipo
primitivo. Nel nostro esempio, la Num ha un campo n, e un costruttore
che inizializza il campo ad un valore specificato come parametro del
costruttore.
  |
Creiamo due oggetti: |
Adesso mettiamo in pratica quello di cui abbiamo appena parlato: istanziamo due oggetti, come nel seguente listato:
Num a = new Num(1);
Num b = new Num(2);
  |
Abbiamo che la n di a (a.n) vale 1,
mentre la n di b (b.n) vale due, e sono separate e distinte. |
Il risultato è che creiamo due istanze diverse, ciascuna con un campo n, che ha un valore indipendente dall'altro. Infatti nella prima istanza il campo n vale 1 mentre nella seconda istanza il campo n vale due.
  |
I costruttori (e i metodi) vengono invocati in un determinato "ambiente" |
Di conseguenza è facile capire che esiste un meccanismo per distinguere i due oggetti. Dall'esterno è facile da capire: abbiamo la variabile a che punta al primo oggetto e la variabile b che punta al secondo oggetto. Ma bisogna anche rendersi conto che esiste un meccanismo per distinguere i due oggetti dall'interno (ovvero da codice che accede ai campi).
  |
questo ambiente è l'oggetto corrente |
In pratica il codice di costruttori e metodi viene invocato in un ambiente: grazie a questo e ambiente si riesce ad accedere all'oggetto corrente.
  |
modificare i campi significa modificare il proprio oggetto lasciando inalterati gli altri |
Quando si modificano i campi in realtà si modifica l'ambiente in cui viene invocato oggetto, ed è in questo modo che l'oggetto viene modificato senza che vengano intaccati i campi degli altri oggetti.
|