Что именно является ссылкой в Java?
Что именно является ссылкой в Java? Это адрес памяти? Является ли ссылка на Java эквивалентом разыменованного указателя C++?
Другими словами, учитывая следующее:
Object o1 = new Object();
Object o2 = new Object();
o1 == o2
Является ли приведенное выше сравнение эквивалентом сравнения двух указателей в C++?
4 ответа
o1 == o2
да, в значительной степени эквивалентно сравнению двух указателей в C/C++.
Но между ссылками в Java и указателями в C/C++ есть два основных отличия:
- Java-ссылки не могут выполнять арифметику указателей: вы не можете "добавить 3" к ссылке, вы можете только позволить ей указывать на другой (известный) объект
- Ссылки на Java строго типизированы: вы не можете "переосмыслить" то, что лежит на другом конце ссылки, если вы не переосмыслите это как тип, которым на самом деле является этот объект.
Также короткое примечание о слове "ссылка": в C++ есть ссылки, которые действуют совершенно иначе, чем указатели в C и ссылки в Java (но я не знаю достаточно о C++, чтобы рассказать вам о специфике).
Для подробного обсуждения этого см. Этот связанный вопрос на programmers.SE.
Что именно является ссылкой в Java?
Это индекс объекта. Его можно рассматривать как указатель, но он отличается тем, что
- может измениться в любое время.
- не всегда имеет прямую связь с адресами памяти.
- обычно 32-битный в 64-битной JVM.
- Вы не можете переосмыслить то, на что ссылается ссылка. Вы можете изменить только тип самой ссылки.
Является ли приведенное выше сравнение эквивалентом сравнения двух указателей в C++?
Да.
При сжатии Упс, который позволяет 64-битной JVM подавать в суд на 32-битные ссылки.
Улучшения производительности виртуальной машины Java HotSpot™ - Сжатые упс
IBM V6 - более эффективное использование кучи с использованием сжатых ссылок
Да, ссылка - это то же самое, что указатель. Кстати, если вы вызываете метод с нулевой ссылкой, вы получаете... исключение NullPointerException.
Обратите внимание, что это не обязательно должен быть адрес памяти. Данный объект может храниться в другом месте во время выполнения программы, и при этом сохранять ту же ссылку. Но вам не нужно заботиться, поскольку арифметика указателей не существует в Java.
Ссылка - это "указатель" на адрес памяти в Java, хотя Java отличается от прямого манипулирования указателями, в отличие от C++. Объекты в Java никогда не передаются методам или не возвращаются методами, это всегда ссылка, которая передается.