В моей книге Java объясняется, что для использования объектов мы можем назначить их ссылочным переменным. Как это отличается от указателя на объект? Есть ли у Java указатели?
Спасибо:)
В моей книге Java объясняется, что для использования объектов мы можем назначить их ссылочным переменным. Как это отличается от указателя на объект? Есть ли у Java указатели?
Спасибо:)
Ссылка похожа на указатель, на который вы не можете выполнить арифметику... хотя это более непрозрачно. Хотя базовые биты могут быть адресом в виртуальной памяти, они не обязательно должны быть. Это всего лишь способ добраться до объекта (или представления нулевого значения). Поэтому, хотя они не совсем то же самое, если вы привыкли думать о указателе как о "способе идентификации объекта или навигации к нему" (в некотором смысле), то да, эти мысли также относятся к ссылкам.
В Java нет указателей как таковых (в отличие, скажем, от С#, который имеет ссылки и указатели - последний используется в "небезопасном" коде).
Термины "ссылка" и "указатель" в основном эквивалентны. Большая часть литературы, которую я видел об основах Java, утверждает, что Java не имеет указателей. Но если вы попытаетесь использовать ссылку null
, вы получите NullPointerException
. Итак, вся семантика.
(Реальная разница: в C или С++ термин "указатель" строго означает целое число, которое является адресом памяти некоторых данных. Если в Java термин "ссылка" более точно соответствует понятию "ссылка" С++ Вы не можете работать с адресом памяти напрямую, даже если хотите, но используете его таким же образом.)
Cat x = new Cat();
Эта строка создает объект Cat в памяти и сохраняет ссылку на него в x.
x теперь содержит ссылку на объект Cat, но если вы должны были сделать:
x = x + 1;
Это не даст следующий адрес памяти, как в C, но даст ошибку компилятора. Java не позволяет управлять ссылкой или памятью.
Нет, Java не имеет указателей. Основные понятия в Java - это "значения" и "ссылки".
Ссылка - это указатель, который обычно не может видеть значение (т.е. адрес памяти). Единственными разрешенными действиями являются установка его (из другой ссылки) и ссылки на него на связанный объект. Он может быть задан из ссылочного выражения, такого как новый оператор, или из другой ссылки (которая является синтаксически простым ссылочным выражением).
Если мы думаем о ссылках или указателях как о способе доступа или обработки объекта в памяти, они почти одинаковы. Однако они отличаются в плане реализации. Ниже приведены различия:
Указатели поддерживают арифметику указателя, и это делает их небезопасными. Потому что они предоставляют программисту уровень доступа, который намного больше, чем необходимо. Однако ссылки предоставляют дескриптор объекта через более абстрактную скрытую реализацию.
Указатели менее строго типизированы, а ссылки более строго типизированы. Под этим я подразумеваю, что код очень прост в случае ссылок и немного менее формален в случае указателей. Вам нужно использовать типы reinterpret_cast для использования указателей, а с другой стороны, ссылки поддерживают легкие отбрасывания типа примитивного типа прикладов в "C".
Указатели небезопасны, а ссылки безопасны. Если у вас есть опция между двумя ссылками выбора. В таких языках, как С#, у вас есть эта свобода.
Указатели существуют в C/С++, а ссылки существуют в Java. Не путайте ссылки в C/С++ со ссылками на Java. Ссылки в C/С++ - это своего рода синоним, используемый для rvalue указателя в C/С++.
С точки зрения синтаксиса Java - это правда, что Java не имеет указателей, но чтобы прояснить ситуацию - Java Runtime имеет указатели. Каждый раз, когда происходит GC, есть большая вероятность, что ваш объект, сохраненный в куче, физически изменит свой адрес памяти. Это достижимо только с помощью того, что на самом деле называется Pointer. Как вы пришли из мира C++
- вы знаете ограничения ссылок. Но это не значит, что JVM не использует ссылки =).
Для получения дополнительной информации взгляните на Обычный указатель объекта
Итак, поскольку у вас есть краткое представление об управлении памятью ядра JVM, вы можете рассматривать термин Java Reference как Pointer во время выполнения.
Нет, никакой передачи по ссылке нет. Только передавайте по значению, так как реальный аргумент метода Java является копией ссылки Java, следовательно - другой указатель.
Таким образом, с точки зрения использования синтаксиса - Java Reference ближе к C++ Reference, но в реальном мире Runtime он близок к Pointer.
Ps для большей ясности лучше прочитать больше статей об Ordinary Object Pointer или взять лут на oop.hpp.
указатель содержит только адрес, но ссылка не содержит адрес, если мы говорим откровенно, тогда адрес объекта присваивается индексу, или мы говорим, что хэш-код и код кода присваиваются ссылочной переменной, если мы увидим содержимое ссылочной переменной, которое начинается с класса Name @, а после него - некоторый шестнадцатеричный код. Эти nos не являются адресом, это значение индекса или хеш-код.
вторая точка мы не можем выполнять арифметические операции над значениями. Содержание ссылочного значения