Что именно является ссылкой в ​​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™ - Сжатые упс

Сжатый ой в Hotspot JVM

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

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

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

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

Другие вопросы по тегам