В чем разница между указателем и ссылочной переменной в Java? - PullRequest
14 голосов
/ 15 сентября 2011

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

Спасибо:)

Ответы [ 8 ]

17 голосов
/ 15 сентября 2011

Ссылка - это что-то вроде указателя, с которым невозможно выполнить арифметику ... хотя она более непрозрачна. Хотя базовые биты могут быть адресом в виртуальной памяти, они не должны быть такими. Это просто способ добраться до объекта (или представить нулевое значение). Поэтому, хотя они не совсем одинаковы, если вы привыкли думать о указателе как о «способе идентификации объекта или навигации по нему» (в некотором смысле), тогда да, эти мысли применимы и к ссылкам.

Java не имеет указателей как таковых (в отличие, скажем, от C #, у которого есть ссылки и указатели - последний используется в «небезопасном» коде).

11 голосов
/ 15 сентября 2011

Термины «ссылка» и «указатель» в основном эквивалентны. Большая часть литературы, которую я видел об основах Java, утверждает, что у Java нет указателей. Но если вы попытаетесь использовать ссылку null, вы получите NullPointerException. Так что это все семантика.

(Реальная разница в том, что в C или C ++ термин «указатель» строго означает целое число, которое оказывается адресом памяти некоторых данных. В то время как в Java термин «ссылка» более точно соответствует понятию «ссылка» в C ++ . Вы не можете работать с адресом памяти напрямую, даже если хотите, но вы используете его так же.)

3 голосов
/ 28 августа 2015
Cat x = new Cat();

Эта строка создает объект Cat в памяти и сохраняет ссылку на него в x.

x теперь содержит ссылку на объект Cat, но если бы вы сделали:

x = x + 1;

Это не даст следующий адрес памяти, как в C, но даст ошибку компилятора. Java не позволяет управлять ссылкой или местоположением памяти.

2 голосов
/ 15 сентября 2011

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

2 голосов
/ 15 сентября 2011

Нет, в Java нет указателей. Основными понятиями в Java являются «значения» против «ссылок».

1 голос
/ 15 августа 2015

Если мы думаем о ссылках или указателях как о способе доступа к объекту в памяти или обращения с ним, они во многом совпадают.Тем не менее, они разные с точки зрения реализации.Ниже приведены различия:

  1. Указатели поддерживают арифметику указателей, что делает их небезопасными.Потому что они предоставляют программисту уровень доступа, который намного больше, чем нужно.Однако ссылки обеспечивают дескриптор объекта посредством гораздо более абстрактной скрытой реализации.

  2. Указатели менее строго типизированы, а ссылки - более строго типизированы.Под этим я подразумеваю, что код намного проще в случае ссылок и немного менее формален в случае указателей.Вам нужно использовать reinterpret_cast, чтобы использовать приведения указателей, и, с другой стороны, ссылки поддерживают простое приведение типов примитивных приведений типа "C".

  3. Указателинебезопасны и ссылки безопасны.Если у вас есть выбор между двумя выбрать ссылки.В таких языках, как C #, у вас есть эта свобода.

  4. Указатели существуют в C / C ++, а ссылки существуют в Java.Не путайте ссылки в C / C ++ со ссылками в Java.Ссылки в C / C ++ - это своего рода синоним, используемый для обозначения указателя в C / C ++.

0 голосов
/ 12 июля 2019

С точки зрения синтаксиса Java - это правда, что в Java нет указателей, но для прояснения ситуации - Java Runtime имеет указателей.Каждый раз, когда происходит GC , есть большая вероятность, что ваш объект, хранящийся в куче , физически изменит свой адрес памяти.Это достижимо только при использовании так называемого Pointer .Как вы пришли из C++ мира - вы знаете ограничения ссылок.Но это не значит, что JVM не использует ссылки =).

Для получения дополнительной информации взгляните на Указатель на обычные объекты

Итак, краткоПонимая основы управления памятью JVM, вы можете рассматривать Java Reference term как Указатель во время выполнения.

Нет, передача по ссылке совсем.Только передавайте по значению, поскольку настоящий аргумент метода Java является копией Java Reference , следовательно, - еще один Pointer .

Таким образом, с использованием синтаксиса - Java Reference ближе к C ++ Reference , но в реальном мире времени выполнения он близок к Pointer .

Ps для большего уточнения лучше прочитать больше статей о Указатель на обычные объекты или взять лут на oop.hpp .

0 голосов
/ 26 сентября 2014
Указатель

содержит только адрес, но Ссылка не содержит адрес, если мы скажем откровенно адрес объекта присваивается индексу или мы можем сказать, что хэш-код и код прецедента присваиваются ссылочной переменной, если мы увидим содержимое ссылочной переменной, которое начинается с класса Name @, а после него некоторый шестнадцатеричный код. Эти номера не являются адресами, это значение индекса или хэш-код.

вторая точка Мы не можем выполнять какие-либо арифметические операции над значениями Содержание справочного значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...