Ho letto un bel po 'di risorse su Internet e ora sono abbastanza confuso sull'esistenza dei puntatori in Java.
Alcuni sostengono che ci siano dei puntatori e alcuni affermano che non esiste un tale concetto. Allora, qual è la verità?
Al valore nominale, poiché la specifica della lingua Java ufficiale indica in modo specifico i puntatori, quindi la risposta è SÌ , i puntatori esistono in Java.
Quindi, come spieghiamo qui le apparenti opinioni contraddittorie? Bene, come molti problemi, il disaccordo si riduce alla semantica.
Il termine " pointer " è strongmente associato al C / Concetto C ++ di puntatori, che sono variabili che memorizzano esplicitamente gli indirizzi di memoria e che possono essere modificati aritmeticamente per puntare a qualsiasi indirizzo arbitrario. In Java esistono dei puntatori, ma non come un concetto di linguaggio di prima classe. Piuttosto, i puntatori esistono solo come un dettaglio di implementazione per i riferimenti. Le specifiche dicono:
An object is a class instance or an array.
The reference values (often just references) are pointers to these objects, and a special null reference, which refers to no object.
Sta anche dicendo che l'accesso a un riferimento null genera un NullPointerException
, non un NullReferenceException
. Quindi, chiaramente i progettisti Java stavano almeno pensando in termini di indicatori quando hanno scritto le specifiche del linguaggio Java. (Anche se in realtà dovrebbe essere chiamato NullReferenceException
, a mio avviso il nome di quell'eccezione passa attraverso l'astrazione)
Quindi, la risposta è che i riferimenti Java sono "pointer-ish", nel senso che sono implementati in termini di puntatori (proprio come la maggior parte delle implementazioni dei riferimenti C ++), ma i riferimenti Java forniscono un'astrazione di livello superiore che limita il programmatore di manipolare l'indirizzo di memoria reale. Sintatticamente, un riferimento Java ti dà solo accesso ai membri o ai metodi dell'oggetto -oggetto - non che indica la posizione di memoria dell'oggetto.
Quindi sì, i puntatori esistono in Java, per un certo valore di "esiste". Ma probabilmente non è utile parlare in termini di "puntatori" quando si discutono concetti di linguaggio Java.
Java ha dei puntatori. Ogni volta che crei un oggetto in Java, stai effettivamente creando un puntatore all'oggetto; questo puntatore può quindi essere impostato su un oggetto diverso o su null e l'oggetto originale continuerà a esistere (raccolta dati in sospeso).
Ciò che non puoi fare in Java è l'aritmetica del puntatore. Non puoi dereferenziare un indirizzo di memoria specifico o incrementare un puntatore.
Se vuoi davvero diventare di basso livello, l'unico modo per farlo è con Java Native Interface; e anche in questo caso, la parte di basso livello deve essere eseguita in C o C ++.