Есть ли в Java понятие «указатели» или «небезопасный код»? - PullRequest
24 голосов
/ 19 августа 2011

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

Ответы [ 7 ]

20 голосов
/ 19 августа 2011

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

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

15 голосов
/ 19 августа 2011

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

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

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

10 голосов
/ 19 августа 2011

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

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

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

Однако это не правильно.

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

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

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

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

8 голосов
/ 19 августа 2011

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

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

Другая информация о Википедии и Oracle .

3 голосов
/ 19 августа 2011

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

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

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

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

1 голос
/ 19 августа 2011

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

1 голос
/ 19 августа 2011

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

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