I riferimenti potrebbero essere implementati memorizzando l'indirizzo. Solitamente i riferimenti Java saranno implementati come puntatori, ma ciò non è richiesto dalle specifiche. Possono utilizzare un ulteriore livello di riferimento indiretto per abilitare la raccolta dei dati inutili. Ma alla fine si ridurrà (quasi sempre) a puntatori (in stile C) coinvolti nell'implementazione di riferimenti (in stile Java).
Non puoi eseguire l'aritmetica del puntatore con i riferimenti. La differenza più importante tra un puntatore in C e un riferimento in Java è che non puoi effettivamente (e manipolare) il valore sottostante di un riferimento in Java. In altre parole: non puoi eseguire l'aritmetica del puntatore.
In C puoi aggiungere qualcosa a un puntatore (ad esempio l'indirizzo) o sottrarre qualcosa per indicare cose che sono "vicine" o puntare a luoghi che sono in qualsiasi posto.
In Java, un riferimento punta a una cosa e solo a quella cosa. Puoi fare in modo che una variabile abbia un riferimento diverso , ma non puoi semplicemente chiedere di indicare "la cosa dopo la cosa originale".
I riferimenti sono strongmente tipizzati. Un'altra differenza è che il tipo di riferimento è molto più strettamente controllato in Java rispetto al tipo di puntatore in C. In C puoi avere int*
e convertirlo in char*
e reinterpretare la memoria in quella posizione. Quella reinterpretazione non funziona in Java: puoi solo interpretare l'oggetto all'altra estremità del riferimento come qualcosa che è già (cioè puoi lanciare un riferimento Object
a String
riferimento solo se l'oggetto puntato è in realtà un String
).
Queste differenze rendono i puntatori C più potenti, ma anche più pericolosi. Entrambe le possibilità (aritmetica del puntatore e reinterpretazione dei valori puntati) aggiungono flessibilità a C e sono la fonte di alcuni del potere della lingua. Ma sono anche grandi fonti di problemi, perché se usate in modo errato possono facilmente interrompere le ipotesi su cui è costruito il codice. Ed è abbastanza facile usarli in modo errato.