I puntatori esistono davvero in Java? [duplicare]

3

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à?

    
posta Nilesh 05.08.2013 - 06:09
fonte

2 risposte

14

Al valore nominale, poiché la specifica della lingua Java ufficiale indica in modo specifico i puntatori, quindi la risposta è , 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.

    
risposta data 05.08.2013 - 13:33
fonte
7

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

    
risposta data 05.08.2013 - 06:17
fonte

Leggi altre domande sui tag