Что такое ссылка на Java?
Что такое ссылка на Java? Это адрес памяти? Является ли ссылка Java эквивалентом разыменованного указателя С++?
Другими словами, учитывая следующее:
Object o1 = new Object();
Object o2 = new Object();
o1 == o2
Является ли приведенное выше сравнение эквивалентом сравнения двух указателей в С++?
Ответы
Ответ 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 никогда не передаются методам или не возвращаются методами, это всегда ссылка, которая передается.