2010-08-10 15 views
6

Sappiamo che la variabile di riferimento dell'oggetto contiene bit che rappresentano un modo per accedere a un oggetto.Cosa c'è dentro una variabile di riferimento in Java?

Non tiene l'oggetto stesso, ma contiene qualcosa come un puntatore o un indirizzo.

stavo attraversando la (2 ° edizione), Libro, Testa-First Java e nel libro è scritto (nel capitolo 3, pagina 54), che

In Java non sappiamo veramente cosa è all'interno di una variabile di riferimento. Facciamo sapere che qualunque cosa sia, è rappresenta uno e un solo oggetto. E la JVM sa come usare il riferimento per arrivare all'oggetto. -

voglio chiedere:

  • fare una variabile oggetto di riferimento tiene puntatore, indirizzo o cosa?
  • Come interpreta JVM?
+1

Dai un'occhiata a un'implementazione aperta come OpenJDK se sei così curioso :) – KeatsPeeks

+0

No, non molto curioso :) solo un principiante in Java. –

risposta

11

Spetta interamente alla JVM determinare cosa vada all'interno di un riferimento.

Nel caso più semplice sarebbe solo un puntatore (cioè un indirizzo). In casi più sofisticati, la VM può utilizzare rappresentazioni diverse a seconda della situazione, ad esempio, si consiglia di leggere il documento su "Compressed oops in HotSpot" per vedere come la macchina virtuale HotSpot può evitare di raddoppiare la dimensione dei riferimenti in alcuni (ma non tutti) posti quando in esecuzione come una macchina virtuale a 64 bit.

L'importante è che non si debba sapere né preoccuparsi. Per quanto ti riguarda come programmatore, è solo un insieme opaco di bit: il suo unico scopo è quello di farti raggiungere l'oggetto in questione (o identificare un riferimento nullo).

+0

Ok, grazie :) –

3

Questo è fino alla JVM. Non è garantito che un riferimento Java abbia una semantica oltre a poter accedere ad un oggetto attraverso di esso. Sunacle potrebbe farlo in modo diverso anche per IBM.

In pratica può essere spesso un puntatore di qualche tipo, anche se forse non direttamente all'oggetto poiché può essere spostato dal GC.

+0

Una domanda legittima sarebbe "come vengono implementati i riferimenti in 's JVM" però. – KeatsPeeks

+2

@ Samuel: dipende da come si definisce "legittimo". A meno che tu non stia cercando di modificare la JVM stessa, non c'è alcun uso pratico di queste informazioni. La curiosità va bene, ma questo tipo di domande mi fa sempre pensare che qualcuno sia aggrappato a una mentalità C. –

2

È interamente specifico JVM. Potrebbe essere un indirizzo, un puntatore o qualcosa di più complicato. Non hai, o hai bisogno, alcuna più dura garanzia del fatto che puoi ottenere un oggetto usando il riferimento.

0

Spetta alla JVM decidere esattamente come viene implementato il riferimento.

Detto questo, qualsiasi implementazione "sensata" utilizza probabilmente un puntatore diretto o una forma di puntatore compresso per motivi di prestazioni. Credo che questo si applichi a tutte le JVM di produzione attuali.

Problemi correlati