Подтвердить что ты не робот

Что такое ссылка на Java?

Что такое ссылка на Java? Это адрес памяти? Является ли ссылка Java эквивалентом разыменованного указателя С++?

Другими словами, учитывая следующее:

Object o1 = new Object();
Object o2 = new Object();

o1 == o2

Является ли приведенное выше сравнение эквивалентом сравнения двух указателей в С++?

4b9b3361

Ответ 1

o1 == o2 в значительной степени эквивалентен сравнению двух указателей в C/С++, да.

Но есть два основных отличия между ссылками в Java и указателями в C/С++, которые очень важны:

  • Ссылки на Java не могут выполнять арифметику указателей: вы не можете "добавить 3" к ссылке, вы можете только указать ей на другой (известный) объект
  • Ссылки на Java сильно набраны: вы не можете "переосмыслить" то, что находится на другом конце ссылки, если вы не интерпретируете его как тип, который на самом деле является этим объектом.

Также короткая заметка о слове "ссылка": у С++ есть ссылки, которые действуют совершенно иначе, чем оба указателя в C и ссылки в Java (но я недостаточно знаю о С++, чтобы рассказать вам о специфике).

Для подробного обсуждения этого вопроса см. этот связанный с этим вопрос для программистов .SE.

Ответ 2

Что такое ссылка на Java?

Это индекс объекта. Это может быть хотя бы как указатель, но он отличается тем, что он

  • может меняться в любое время.
  • не всегда имеет прямую связь с адресами памяти.
  • обычно 32-битный в 64-битной JVM.
  • вы не можете повторно интерпретировать то, на что ссылается ссылка. Вы можете изменить тип самой ссылки.

Является ли приведенное выше сравнение эквивалентом сравнения двух указателей в С++?

Да.


On Compresses Oops, который позволяет 64-битной JVM подавать в суд на 32-разрядные ссылки.

Улучшения производительности виртуальной машины Java HotSpot ™ - сжатые ошибки

Сжатый сбой в JVM Hotspot

IBM V6 - более эффективное использование кучи с использованием сжатых ссылок

Ответ 3

Да, ссылка в основном такая же, как указатель. Кстати, если вы вызываете метод с нулевой ссылкой, вы получаете... исключение NullPointerException.

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

Ответ 4

Ссылка - это "указатель" на адрес памяти в Java, хотя Java позволяет непосредственно манипулировать указателями, в отличие от С++. Объекты в Java никогда не передаются методам или не возвращаются методами, это всегда ссылка, которая передается.