2010-08-10 7 views
6

Nous savons que la variable de référence d'objet contient des bits qui représentent un moyen d'accéder à un objet.Que contient une variable de référence dans Java?

Il ne contient pas l'objet lui-même, mais il contient quelque chose comme un pointeur ou une adresse.

Je traversais le chef-First Java (2e édition) livre et dans le livre, il est écrit (dans le chapitre 3, à la page 54)

En Java, nous ne savons pas vraiment ce qui est dans une variable de référence. Nous savons que peu importe ce que c'est, représente un et un seul objet. Et la JVM sait comment utiliser la référence pour accéder à l'objet. -

Je veux demander:

  • faire une variable de référence d'objet contient pointeur, adresse ou quoi?
  • Comment la JVM interprète-t-elle cela?
+1

Jetez un oeil à une implémentation ouverte comme OpenJDK si vous êtes si curieux :) – KeatsPeeks

+0

Non, pas si curieux :) juste un débutant en Java. –

Répondre

11

Il appartient entièrement à la JVM de déterminer ce qui se passe dans une référence.

Dans le cas le plus simple, ce serait simplement un pointeur (c'est-à-dire une adresse). Dans des cas plus sophistiqués, la machine virtuelle peut utiliser différentes représentations en fonction de la situation - par exemple, vous pouvez lire l'article sur "Compressed oops in HotSpot" pour voir comment la machine virtuelle HotSpot peut éviter de doubler la taille des références dans certains (mais pas tous) fonctionnant comme une machine virtuelle 64 bits.

L'important est que vous ne devriez ni savoir ni vous soucier. En tant que programmeur, c'est juste un ensemble de bits opaque - son seul but est de vous permettre d'accéder à l'objet en question (ou d'identifier une référence nulle).

+0

D'accord, merci :) –

3

Cela revient à la JVM. Une référence Java n'est pas garantie d'avoir une sémantique en dehors de laquelle vous pouvez accéder à un objet à travers elle. Sunacle pourrait faire cela différemment d'IBM.

En pratique, il peut souvent s'agir d'un pointeur quelconque, mais peut-être pas directement à l'objet puisque cela peut être déplacé par le GC.

+0

Une question légitime serait "comment les références sont-elles implémentées dans la JVM de ". – KeatsPeeks

+2

@Samuel - cela dépend de la façon dont vous définissez "légitime". Sauf si vous cherchez à modifier la JVM elle-même, il n'y a pas d'utilisation pratique pour cette information. La curiosité est une bonne chose, mais ce genre de questions me fait toujours penser que quelqu'un s'accroche à un état d'esprit C. –

2

C'est entièrement spécifique à la JVM. Ce peut être une adresse, un pointeur ou quelque chose de plus compliqué. Vous n'avez pas, ou n'avez pas besoin, de garanties plus dures que le fait que vous pouvez obtenir un objet en utilisant la référence.

0

Il appartient à la JVM de décider exactement comment implémenter la référence. Cela étant dit, toute implémentation "saine" utiliserait probablement un pointeur direct ou une forme de pointeur compressé pour des raisons de performances. Je crois que cela s'applique à toutes les machines JVM de production actuelles.

Questions connexes