2010-08-10 7 views
6

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

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

Я шел через (второе издание) книги Глава первая Java и в книге написано (в главе 3, стр 54), что

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

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

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

Посмотрите на открытую реализацию, такую ​​как OpenJDK, если вам это любопытно :) – KeatsPeeks

+0

Нет, не так уж любопытно :) просто новичок в Java. –

ответ

11

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

В простейшем случае это будет просто указатель (т. Е. Адрес). В более сложных случаях виртуальная машина может использовать разные представления в зависимости от ситуации - например, вы можете прочитать статью по адресу "Compressed oops in HotSpot", чтобы увидеть, как виртуальная машина HotSpot может избежать удвоения размера ссылок в некоторых (но не во всех) местах, когда работает как 64-разрядная виртуальная машина.

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

+0

Хорошо, спасибо :) –

3

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

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

+0

Допустимым вопросом будет «как, например, ссылки, реализованные в JVM ». – KeatsPeeks

+2

@Samuel - это зависит от того, как вы определяете «законный». Если вы не хотите изменять JVM, для этой информации нет практического использования. Любопытство в порядке, но такие вопросы всегда заставляют меня думать, что кто-то цепляется за C-образность. –

2

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

0

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

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

Смежные вопросы