Как работает Java с передачей ссылочных типов данных? Может ли кто-нибудь дать четкую картину?Справочный тип Java
ответ
Java передает копию ссылки на метод. Ссылка все же указывает на тот же экземпляр.
Представьте, если бы у меня был лист бумаги с адресом ресторана. Вы также хотите пойти в тот же ресторан, чтобы я получил новый лист бумаги и скопировал адрес ресторана на эту бумагу и передал его вам. Оба листа бумаги указывают на один и тот же ресторан, но они являются отдельными ссылками.
Сам ресторан не дублируется, только ссылка на него дублируется.
Джон Скит provides a similar analogy:
Баллон аналогия
Я полагаю, каждый объект как гелиевого шара, каждый ссылку как часть строки, и каждую переменную, как то, что может держитесь за кусок строки. Если ссылка является нулевой ссылкой, то это , например, с куском строки без все прикрепленное к концу. Если это ссылка на подлинный объект, это кусок строки, привязанный к воздушному шару , представляющему этот объект. Когда ссылка копируется (либо для присваивания значения переменного или в качестве части вызова метода) это как если другая часть строки создаются прикреплено к независимо первая часть строки является присоединена. Фактический кусок строки переменной (если таковой имеется) равен . Держатель никуда не годится - только копируется.
Вот пример:
// Here I have one instance and one reference pointing to it
Object o = new Object();
// At this moment a copy of "o" is made and passed to "foo"
foo(o);
void foo(Object obj) {
// In here I have obj which is a copy of whatever
// reference was passed to me
}
Спасибо, Можете ли вы дать мне пример кода, где это происходит? – Jony
Я думаю, что ваш пример кода немного вводит в заблуждение в том смысле, что он ссылается на «копию», сделанную и переданную методу. Объект в методе - это тот же самый объект, который был создан и передан ему, а комментарии там не звучат так. – ColinD
@ColinD - Пока экземпляр тот же, ссылки являются отдельными. Это действительно копия 'o', которая передается методу,' o' является * reference *, а не экземпляром. –
Все Java объекты (все кроме примитивов, таких как int
, float
, boolean
, и т.д ...) являются ссылки на объект заостренные Себе.
Так, например:
Foo f = new Foo();
Выше f
является ссылкой на объект типа Foo
. Если вы затем функцию:
void doSomething(Foo myFoo) { ... }
doSomething(f);
doSomething()
функция получает один и тот же объект, который f
относится. Поэтому, если doSomething()
мутирует f
, он мутирует этот объект.
В отличие от C++, нет выбора между передачей по значению, ссылке или с помощью указателей. Все переменные типа класса являются ссылками (или указателем в зависимости от вашей точной терминологии).
Одна из проблем заключается в том, что люди часто пытаются применить свои знания и терминологию на языке C++ для Java, что не сработает.
Java передается по значению. Ссылки на объекты передаются по значению. – ColinD
Как уже упоминал ColinD: у Java есть только один механизм для передачи объектов: «по значению». Этот ответ можно интерпретировать, что Java передает «по ссылке», что неверно. Обратите внимание, что «может быть истолковано»: я не уверен, что вы так выразились. –
Но для всех целей и задач переменные типа класса (в Java) всегда действуют как ссылки. По вашей же логике можно было бы также сказать, что C поддерживает только передачу по значению. Но мы все знаем, что C поддерживает указатели, которые позволяют вам рассматривать такие вещи, как ссылки. Проблема в том, что вы пытаетесь применить C++-стиль-язык к Java, который не является C++. –
- 1. Java C++ Справочный вопрос
- 2. Справочный справочный каталог GCC
- 3. Что передать? Справочный объект или тип значения?
- 4. Справочный менеджер заданий для Java?
- 5. Справочный сгенерированный код в Java
- 6. Справочный родительский элемент пользовательского интерфейса в Java
- 7. Тип: Справочный интерфейс в классе при использовании AMD
- 8. Справочный интерфейс со стороны проекта
- 9. Справочный материал для uops?
- 10. Справочный макет MVC WebAPI
- 11. MVC 6 справочный номер
- 12. Справочный лист WCF
- 13. Справочный инструмент для печати?
- 14. PDF Перекрестный справочный поток
- 15. Справочный заказ блока Magento
- 16. Справочный документ родительского окна
- 17. VB.NET Справочный ресурс
- 18. Справочный родительский объект
- 19. Указатели и справочный номер
- 20. Получить Справочный ресурс EditText
- 21. Справочный работник Неприпущенная копия
- 22. Вызов createJpg (справочный лист)
- 23. Справочный каталог MSVC
- 24. Обратный справочный стол
- 25. Справочный рабочий отчетПрогрессный метод
- 26. NHibernate самостоятельный справочный запрос
- 27. Справочный документ Couchdb
- 28. Справочный работник и функции
- 29. Справочный контекст данных XAML
- 30. Справочный псевдоним в подзапросе
Хотя Java использует ссылки, механизм, который он использует для передачи «материала», равен * «по значению» *. См.: Http://javadude.com/articles/passbyvalue.htm –