  |
Una classe può essere considerata come un semplice record. |
class Stack {
int top;
int[] stack;
}
Per meglio capire come funziona la programmazione ad oggetti faremo una
ricostruzione "storica". In effetti il concetto di "classe" è a tutti gli
effetti una evoluzione abbastanza naturale del concetto di "record" del Pascal
(o di struttura del C): ovvero il tipo di dato derivato risultante
dall'aggregazione di altri tipi di dato. Una classe degenere è infatti a tutti
gli effetti un record. Consideriamo la struttura dati nel listato precedente.
Si tratta di una classe con due campi. In questo caso, si tratta di una
dichiarazione in tutto e per tutto analoga alla dichiarazione di un record
puro come quelli del Pascal, ovvero una struttura dati aggregata, che mette
insieme un intero e un array di interi.
  |
Quando uso un record devo prima crearlo |
// creo lo stack
Stack s=new Stack () ;
Ora, una dichiarazione di una struttura dati di tipo record è appunto
semplicemente una dichiarazione: dice come deve essere la struttura dati ma
non ne crea alcuna. Anche per i record in pascal, quando decido di creare una
"istanza" (appunto) del record, la devo creare esplicitamente. Anche in pascal
è richiesto l'uso di new. Ma noi usiamo la sintassi di Java anche per questo
caso in cui stiamo evidenziando le analogie con il Pascal. E in questo caso dobbiamo
scrivere new Stack() invece di new Stack. La differenza (sottile) è che nel primo caso
abbiamo usato il nome del record, mentre in Java in realtà stiamo invocando
un costruttore. Ignoriamo per ora questa differenza e semplicemente rendiamoci
conto che abbiamo solamente creato una struttura dati aggregata che contiene
le strutture dati definite nella dichiarazione.
  |
Poi devo inizializzarlo esplicitamente: |
s.top=0;
s.stack = new int (10);

Nei vecchi tempi andati (quelli della programmazione strutturata e degli
algoritmi + strutture dati), potevamo solamente creare la struttura dati.
Che fosse buona all'uso così come era non era detto, per cui spesso (per non
dire quasi sempre) una inizializzazione era d'obbligo. E infatti la nostra
struttura dati se deve essere usata come Stack è tutt'altro che completa.
Infatti al top bisogna dargli il suo valore iniziale, e soprattutto allo stack
(che è un array di interi) bisogna crearlo esplicitamente. Non dimentichiamo
che un array è un oggetto e dichiarare la variabile significa solamente
dichiarare una scatola che contiene un PUNTATORE all'istanza vera e propria.
Ma istanziare il record NON mi crea i sotto oggetti: devono venire istanziati
esplicitamente. Per cui l'inizializzazione completa deve essere esplicita.
  |
Adesso possiamo utilizzarlo |
// operazione di push(1)
s.stack [s.top++]=1;
Fatte queste inizializzazioni (esplicite) finalmente lo stack è pronto per
l'uso. Notare che quando usiamo la programmazione strutturata classica si
deve accedere alla struttura dati direttamente, scrivendo codice come quello
nel listato. Manco a dirlo, il risultato sarà sì efficiente (ma serve in questo
caso l'efficienza?), ma poco comprensibile. E molto poco modificabile.
|