ePrometeusCorsoJavaJava
testi articoli
Testi Articoli  Download
Home | Basi | Espressioni | Comandi | Classi | Ereditarieta | Eccezioni | Thread | Utilita | 
CorsoJava è ora Video! Free for all!
Clicca Qui!

Classi
OOP
Ereditarietà
Polimorfismo
Chiamata
Classi
Record
Istanze
Costruttori
Campi
this
Allocazione
Più costruttori
this()
Inizializzazioni
Riferimenti
Ordine
Metodi
Invocazione
Overloading
Attenzione
Finalizzazione
Static e Final
Campi statici
Blocco static
Metodi statici
Visibilità
Costanti
Package
import
import *
Classpath
L'interprete
Zip e Jar

<<< Record >>>
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.

ePrometeus s.r.l. - Web Software House & Open Source System Integrator
MILANO - SAN BENEDETTO DEL TRONTO(AP)
Contatti: info@eprometeus.com