Что внутри ссылочной переменной в Java? - PullRequest
7 голосов
/ 10 августа 2010

Мы знаем, что переменная ссылки на объект содержит биты, которые представляют способ доступа к объекту.

Он не содержит сам объект, но содержит что-то вроде указателя или адреса.

Я просматривал книгу «Head-First Java» (2-е издание), и в книге написано (в главе 3, стр. 54), что

В Java мы не знаем, что внутри ссылочной переменной. Мы делаем знаю, что бы это ни было, это представляет один и только один объект. И JVM знает, как использовать ссылка, чтобы добраться до объекта. -

Я хочу спросить:

  • Содержит ли переменная ссылки на объект указатель, адрес или что?
  • Как JVM интерпретирует это?

Ответы [ 4 ]

11 голосов
/ 10 августа 2010

Это полностью зависит от JVM, чтобы определить, что входит в ссылку.

В простейшем случае это был бы просто указатель (то есть адрес). В более сложных случаях виртуальная машина может использовать различные представления в зависимости от ситуации - например, вы можете прочитать статью «Сжатые сообщения в HotSpot» , чтобы увидеть, как виртуальная машина HotSpot может избежать удвоения размера. ссылок в некоторых (но не во всех) местах при работе в качестве 64-битной виртуальной машины.

Важно то, что вы не должны ни знать, ни заботиться. Что касается вас как программиста, то это просто непрозрачный набор битов - его единственная цель - позволить вам добраться до рассматриваемого объекта (или идентифицировать нулевую ссылку).

3 голосов
/ 10 августа 2010

Это зависит от JVM.Ссылка на Java не гарантирует наличия какой-либо семантики, кроме того, что вы можете получить к ней доступ через объект.Sunacle может сделать это и по-другому с IBM.

На практике это часто может быть какой-то указатель, хотя, возможно, не напрямую к объекту, поскольку он может быть перемещен GC.

2 голосов
/ 10 августа 2010

Это полностью зависит от JVM.Это может быть адрес, указатель или что-то более сложное.У вас нет или не нужно никаких более твердых гарантий, чем тот факт, что вы можете получить объект, используя ссылку.

0 голосов
/ 10 августа 2010

JVM должна решить, как именно реализована ссылка.

Сказав это, любая "здравая" реализация, вероятно, будет использовать либо прямой указатель, либо какую-либо форму сжатого указателя по соображениям производительности.Я полагаю, что это применимо ко всем текущим производственным JVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...