Java имеет указатели?

Если Java не имеет указателей, то, что делает new ключевое слово делает в Java?

54
задан royhowie 31 March 2016 в 18:05
поделиться

9 ответов

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

Ссылки Java не похожи на указатели в C, вы не можете «заглянуть под капот» в необработанную память, которая составляет объект.

1
ответ дан 7 November 2019 в 07:55
поделиться

new выполняет (примерно) следующее:

  1. Находит непрерывный свободный блок памяти кучи, равный размеру экземпляра класса, который вы создаете, плюс некоторое пространство для учета.
  2. Обнулить указанное пространство & удалить его из свободного списка
  3. Запустить конструктор
  4. Вернуть ссылку (НЕ указатель, как объяснялось в других сообщениях) на созданный экземпляр.
7
ответ дан 7 November 2019 в 07:55
поделиться

В Java есть указатели в смысле переменных, которые хранят ссылки на данные в памяти. В этом смысле все переменные объектных типов в Java являются указателями.

Однако язык Java не позволяет выполнять арифметические операции со значениями указателей, как если бы вы могли делать это в таком языке, как C.

13
ответ дан 7 November 2019 в 07:55
поделиться

new в Java возвращает ссылку на вновь созданный объект.

0
ответ дан 7 November 2019 в 07:55
поделиться

В Java нет указателей. Оператор «новый» используется для ссылочной переменной в java.

-1
ответ дан 7 November 2019 в 07:55
поделиться

новая ссылка на возврат. он имеет некоторое сходство с указателями (при переходе к функции передается ссылка, как и с указателем), но нет арифметики указателя.

0
ответ дан 7 November 2019 в 07:55
поделиться

Как уже указывалось, в Java есть ссылки. Чем они отличаются?

  1. вы не можете выполнять арифметические или другие подобные операции с эти
  2. они не указывают на память, содержащую объект (т.е. они не являются указателями с другим именем). JVM может свободно перемещать объекты в памяти виртуальной машины и, скорее всего, будет делать во время сборки мусора. Однако ссылки по-прежнему указывают на этот объект, несмотря на его перемещение в памяти.

Таким образом, они не похожи на ссылки C ++ (указывающие непосредственно на объект). Возможно, лучшим именем было бы handle .

47
ответ дан 7 November 2019 в 07:55
поделиться

В Java нет указателей; У Java есть ссылки.

Это замечательный момент, но с указателем есть дополнительные операции, которые вы можете (или не можете) обычно использовать; в ссылке эти операции отсутствуют, поскольку они могут быть небезопасными.

Например, если вы используете указатель для индексации первого элемента массива следующим образом:

int squares[] = {1, 4, 9, 16, 25, 36, 49};
int* intPointer = squares;

вы можете захотеть разыменовать указатель и получить значение «1», но вы также можете:

intPointer++

и после вы сделаете это, при разыменовании указателя вы получите значение «4». Второй

intPointer++;

при разыменовании даст вам значение «9». Это потому, что операция ++ перемещает указатель на одну «единицу» вперед в памяти.

Проблема возникает из-за недостатков системы проверки типов C / C ++ (C ++ должен поддерживать совместимость с C, поэтому он допускает те же проблемы). Указатель сохраняет адрес в памяти, а операция ++ добавляет к адресу соответствующее количество байтов. Во многих системах ++ ing int добавляет четыре байта, но если указатель был указателем char ++ ing, он должен добавить только один байт. Обратите внимание, что, поскольку базовый тип данных указателя является адресом в памяти, следующее допустимо (но не рекомендуется):

char* charPointer = squares;
charPointer++;

void* voidPointer = squares;
voidPointer++;

Поскольку указатели являются адресами в памяти, они могут представлять (правильно) любой бит памяти в компьютере, но они правильно разыменовываются только тогда, когда базовые данные сопоставляют тип и выравнивание указателя. Для указателей, которые не управляются большим количеством кода, чтобы сделать их безопасными, это означает, что вы можете отклониться от типа данных (или выравнивания) желаемой информации, и разыменование может закончиться катастрофой.Попытка исправить эту проблему с помощью пользовательского кода имеет тенденцию замедлять работу одного указателя настолько сильно, что вы заметите проблемы с производительностью, и открывает двери для добавления ошибок в пользовательский код «управления указателем».

Сторона Java устраняет все эти проблемы, возвращая ссылку. Ссылка не относится ни к какому месту в памяти; Java поддерживает внутреннюю таблицу «ссылки на указатель». Эта таблица принимает ссылку и возвращает связанные с ней данные, где бы эти данные ни находились в памяти. Это замедляет выполнение кода, потому что для каждого «разыменования» выполняется два поиска, один поиск в справочной таблице, один в памяти машины.

Большим преимуществом использования ссылок в Java является то, что память можно перемещать, не нарушая адреса потенциальных указателей. В программе на языке C, если вы перемещаете данные в новую ячейку памяти, очень трудно узнать, есть ли в какой-либо другой части программы указатель на данные. Если устаревший указатель будет разыменован после перемещения памяти, программа будет обращаться к поврежденным данным, и, как правило, сбой будет недостатком.

Возможность перемещать память в запущенной программе позволяет программам легко перерабатывать память. Любая программа, которой не нужны фрагменты памяти, может освободить неиспользуемую память, но это создает дыры в памяти из неиспользуемой памяти между фрагментами используемой памяти. Внутренне компьютеры используют довольно большие страницы памяти. Если для редко используемой страницы памяти несколько использованных битов можно было бы переместить на другую страницу, тогда страница памяти может быть освобождена. Это увеличивает плотность данных в памяти, улучшая производительность кеша.Иногда это приводит к значительному повышению производительности.

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

38
ответ дан 7 November 2019 в 07:55
поделиться

В java мы встречаем определенные ключевые слова, используемые в качестве ссылки, например это ключевое слово используется для ссылки на переменные того же класса. Оператор new используется как ссылка на объект.

-3
ответ дан 7 November 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: