Подтвердить что ты не робот

У java действительно есть указатели или нет?

Я посмотрел на Google ответы, но я не удовлетворен.

Моя логика:

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

Моя путаница/вопрос:

В чем заключается цель не иметь указателей на языке программирования, например Java, специально разработанном для использования в Интернете в любой системе, в сравнении с языком программирования, например С++, который использует указатели?

Edit


Многие из вас говорят: "Чтобы это было просто". Если это так, то почему популярный язык программирования, например c++, использует указатели?

4b9b3361

Ответ 1

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

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

Необработанные указатели на С++ также не нужны в высококачественном, систематическом и идиоматическом программировании. То, что делают сырые указатели (а именно, арифметика указателей), обычно считается "небезопасным", и поэтому оно просто полностью исключено из Java.

Обратите внимание, что многие вещи, которые люди пытаются сделать с указателями на C и С++, на самом деле являются undefined. Использование указателей правильно оставляет вас с довольно ограниченным набором опций, большинство из которых можно улучшить с помощью идиоматического С++.

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

После вашего обновления: последний абзац (на мой взгляд) является самым ярким объяснением: на С++ вам нужно написать собственный код управления памятью (см. "распределители" ). И память должна обрабатываться с помощью указателей. Поэтому мой строгий ответ заключается в том, что вам нужны указатели на С++, когда вы реализуете управление памятью, и никогда иначе.

Ответ 2

Внутренне ссылка на объект реализуется как указатель. Нет никакой арифметики указателя, хотя...

У С++ есть указатели, потому что он построен как супермножество C, у которого есть указатели. C имеет указатели, потому что он был разработан в 60-х годах. В то время компьютеры имели очень мало памяти, а указатели допускали реализацию строк, массивов и передачи параметров.

Это выдержка из Белой книги Языковая среда Java:

2.2.9 Нет больше указателей

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

У вас больше нет оборванных указателей и пропахивания памяти из-за неправильных указателей, потому что в Java нет указателей.

Ответ 3

Java имеет указатели. На самом деле все в Java - это указатели (называемые ссылками).

Исключения: int, boolean, char и т.д.

Поскольку все указатели, нет необходимости в звездочке, чтобы иметь значение.

Ответ 4

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

Эффективные сборщики мусора полагаются на возможность перемещения объектов вокруг, и это приведет к аннулированию любых указателей, которые (ранее) указывали на объект.

Во-вторых, у Java почти есть указатели. Указатели C/С++ не совсем то, что вы думаете.

Указатель С++ не позволяет просто указывать на произвольный адрес памяти и читать его содержимое. Это не позволяет вам увеличивать указатель за концом массива.

Язык просто не имеет возможности определить, выполняете ли вы эти вещи, и не можете поймать ошибку, когда вы это сделаете. Но это не значит, что это разрешено. Это поведение undefined, и, короче говоря, может что-то сделать.

В Java почти нет указателей. Вот почти полный список того, что вы можете на законных основаниях делать с указателем на С++:

  • разыщите его, чтобы получить объект с указателем.
  • перетащите его, чтобы он указывал на другой объект
  • сделать его нулевым указателем
  • если он указывает на массив, вы можете выполнить арифметику указателя, добавить или вычесть из указателя, если результат все еще указывает на тот же массив или принимает разницу между двумя указателями, если они оба указывают на тот же массив.

Последняя точка действительно единственная, что невозможно в Java. И это настолько ограничено, что люди обычно думают. Это не дает вам карт-бланш для создания указателей на любой старый адрес. Это не позволяет вам "напрямую обращаться к памяти".

Итак, у Java нет указателей, потому что:

  • было бы очень сложно правильно реализовать язык GC'ed,
  • он либо потребует некоторой проверки времени выполнения (чтобы гарантировать, что недопустимые обращения к памяти обнаружены и обработаны безопасно), либо это сделает Java небезопасным языком, где поведение не указано на 100%,
  • просто не так много, потому что указатели допускают очень небольшую дополнительную функциональность, помимо ссылок на Java,

Ответ 5

По той же причине у java нет неподписанных типов. Дизайнеры языка решили не включать их, чтобы сохранить язык "проще".

Ответ 6

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

То же ограничение применяется к С++/CLI; если вы используете определенные выражения в указателях, компилятор больше не может выражать код, используя только байт-код из "безопасного" набора, и компонент не может загрузить, если проверки включены.

Разница между CLI и Java-байт-кодом заключается в том, что Java не имеет "небезопасного" набора команд, поскольку он был специально разработан для ненадежного кода в Интернете.

Ответ 7

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

Ответ 8

Поскольку Java предназначен для простого, безопасного и относительно надежного языка программирования. Указатели - это острый инструмент, который разработчики Java решили не ставить в руки программистов.

@oltarus прав, что в некотором смысле ссылки Java являются указателями, но есть одно существенное различие: вы не можете делать арифметические действия на них, в то время как вы можете сделать арифметику на указателях. Арифметика указателей одновременно является основным источником ошибок с указателями, поскольку вы заставляете их указывать на недопустимые местоположения в памяти (например, забывая их инициализировать или с ошибками "один за другим" ).

Обновление. У С++ есть указатели, потому что они необходимы для такого низкоуровневого системного программирования, который С++ был разработан для поддержки. С++ был разработан как "лучше C" и заменен для этого языка, а это значит, что у него есть все возможности, необходимые для реализации таких вещей, как операционные системы и драйверы устройств. Выполнение этого на языке без указателей практически невозможно.

Оба C и С++ следуют философии, что вы получаете почти полный доступ к аппаратным средствам, если вы просите об этом, поэтому вы можете делать практически все, что хотите, но язык также не остановит вас от глупостей. Java, OTOH, ограничивает ваш доступ к машине, запустив вашу программу в своей песочнице VM.

Ответ 9

Основная причина заключается в том, что указатели приводят ко многим ошибкам, которые очень трудно идентифицировать. В Java способ жизни программиста проще.

Для обновленного вопроса: С++ с указателями имеет лучшую производительность, чем Java.