Существует ли в Java понятие "указатели" или "небезопасный код"?

Вчера я присутствовал на разговоре со стороны технического директора известной европейской компании, и он сказал, что до недавнего времени он не знал, что у java есть указатели. Поговорив с ним, он сказал, что абсолютно уверен в существовании указателей/небезопасного кода в java.

Ответ 1

Там класс под названием sun.misc.Unsafe, это правда. Но он не использует указатели в Java-коде (потому что Java не имеет указателей, хотя я согласен с тем, что ссылки на Java похожи по понятию), большинство из них реализовано с использованием собственного кода.

Как я уже упоминал в комментариях, это не является частью общедоступного API и не должно использоваться клиентским кодом. Тем не менее, вы можете увидеть его на работе, когда вы смотрите на источники классов Atomic* в пакете java.util.concurrent.atomic.

Ответ 2

В Java нет указателей, только безопасные ссылки. К сожалению, ваш высокореализованный технический директор ошибался.

Небезопасный код интегрирован через JNI.

http://en.wikipedia.org/wiki/Java_Native_Interface

Ответ 3

В Java есть указатели.

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

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

Однако это неверно.

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

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

Однако есть JNI, но тогда нативный код делает потенциально опасные вещи, а не код Java.

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

Ответ 4

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

Другое дело. В C вы можете управлять указателями с помощью операции реферирования/разыменования, помещая * сначала имя указателя. В Java эта операция, реферирование/разыменование, полностью отсутствует, поскольку она полностью автоматическая, скрытая для пользователя.

Дополнительная информация о Wikipedia и Oracle.

Ответ 5

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

Мы используем ссылку в java, которая является указателем на JVM.

Когда мы используем новый оператор, он создаёт экземпляр в куче и возвращает адрес ссылки на его указание.

Я считаю, что это ответит на ваш вопрос, если вы не сможете прокомментировать мой ответ.

Ответ 6

Вы можете вызвать собственные функции в Java (JNI), поэтому в этом смысле вы можете использовать указатели. Но кроме этого - нет, в Java нет указателей.

Ответ 7

У него может быть небольшая путаница с call-by-value и call-by-reference. Если он исходит из C, он может подумать, что вызов по ссылке равен указателю. Просто предположим.