2015-04-24 12 views
6

leggevo What is a NullPointerException, and how do I fix it?, e nella risposta accettato, ho letto qualcosa che non ho ben capito:In che modo i puntatori funzionano con i tipi primitivi in ​​Java?

int x; 
x = 10; 

In questo esempio la variabile x è un int e Java inizializzarlo a 0 per tu. Quando lo assegni a 10 nella seconda riga, il tuo valore 10 viene scritto nella posizione di memoria indicata da x.

Ho pensato per i tipi primitivi, la variabile era l'indirizzo di memoria del valore effettivo; dove come per i tipi complessi, la variabile era semplicemente l'indirizzo di memoria di un puntatore al valore attuale. Ma la risposta sopra riportata mi dice che ho torto. Dice "la posizione di memoria indicata da x".

Quindi se x sta puntando a un indirizzo di memoria che memorizza il valore attuale, come è diverso un tipo primitivo da un tipo complesso? Non sapevo che i tipi primitivi avevano anche dei puntatori. Come funzionano i puntatori con i tipi primitivi?

+0

non è ** un riferimento ** nella posizione di memoria? –

+0

@KickButtowski Per tipi complessi, sì. Quello che non capisco è che qualcosa è puntato da x, che è un tipo primitivo. – Evorlor

+0

quando dici punto, mi ricorda puntatore in c e C++ che non abbiamo una cosa simile in Java. –

risposta

9

Un tipo primitivo e un tipo complesso sono diversi l'uno dall'altro principalmente nel modo in cui i dati vengono archiviati. Si sta effettivamente guardando le differenze tra un tipo primitivo e un tipo di classe

1. Ogni variabile è memorizzato come un percorso nella memoria del computer.

La dichiarazione di cui sopra si applica a entrambi i tipi primitivi e anche ai tipi di classe .

Le differenze:

2. Per un tipo primitivo : il valore della variabile è memorizzato nella locazione di memoria assegnata alla variabile.

Questo significa che se abbiamo assegnato int x = 10, il valore di x viene memorizzato in in cui è memorizzato il valore di 10, cioè la posizione di memoria. Ciò significa che quando "guardiamo" in x, "10" è memorizzato lì. Forse sarebbe utile pensare di più come un "incarico", dove si comando che x essere pari a 10.

3. Per un tipo di classe: memorizza solo l'indirizzo di memoria del dell'oggetto che memorizza il valore. Non tiene direttamente l'oggetto stesso.

intero x = 10 avrà un indirizzo di memoria che punta ad oggetto di tipo int, che assumerà poi il valore di 10. Questo è noto come un riferimento . Pensala come una directory che ti dice di andare a quale scaffale recuperare il valore.

anche

tipi classe sono anche noti come tipi di riferimento, o tipi di oggetti, cioè vogliono dire un oggetto di una classe (sia esso una classe Integer o una classe myPerson).

I tipi primitivi non sono tipi di riferimento perché non contengono riferimenti (indirizzi di memoria).

Questa distinzione è la ragione per "classi involucro" in uso quotidiano, e tipi come Integer sono visti come una classe wrapper per un int, per consentire la manipolazione dei dati come la memorizzazione di numeri interi in una struttura di dati come un ArrayList . Perché ints un tipo di dati primitivi, non è un object, mentre è Integer. Dal momento che i tipi primitivi non sono oggetti, dobbiamo metterli in una classe per poterli aggiungere ad elenchi, dizionari ecc. In questo modo abbiamo una lista di oggetti (che, puntano ai tipi primitivi) ma sono non un primitivo datatype primitivo da solo. Vedi this SO question for further info

Ulteriori letture sulla differenza tra un primitivo e non primitivo (noto come classe/riferimento/tipo di oggetto) è dettagliato here. Hanno un bel diagramma che lo illustra anche.

+0

Ho modificato un po 'il tuo formato, quindi può essere facile da leggere. spero che vada bene con te Ne ho già uno più anch'io –

+0

Quindi è solo che mi sono confuso con la dicitura di "la posizione di memoria indicata da x"? Non intendevano implicare che la posizione di memoria di x puntasse ovunque ... intendevano solo x? – Evorlor

+0

@KickButtowski l'ha appena visto. sicuramente va bene con me grazie! Ho aggiunto alcune informazioni quindi ho rispecchiato le tue modifiche. Si prega di modificare di conseguenza! – matrixanomaly

Problemi correlati