2010-04-20 3 views
3

Как работает Java с передачей ссылочных типов данных? Может ли кто-нибудь дать четкую картину?Справочный тип Java

+2

Хотя Java использует ссылки, механизм, который он использует для передачи «материала», равен * «по значению» *. См.: Http://javadude.com/articles/passbyvalue.htm –

ответ

10

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 
} 
+0

Спасибо, Можете ли вы дать мне пример кода, где это происходит? – Jony

+0

Я думаю, что ваш пример кода немного вводит в заблуждение в том смысле, что он ссылается на «копию», сделанную и переданную методу. Объект в методе - это тот же самый объект, который был создан и передан ему, а комментарии там не звучат так. – ColinD

+0

@ColinD - Пока экземпляр тот же, ссылки являются отдельными. Это действительно копия 'o', которая передается методу,' o' является * reference *, а не экземпляром. –

1

Все Java объекты (все кроме примитивов, таких как int, float, boolean, и т.д ...) являются ссылки на объект заостренные Себе.

Так, например:

Foo f = new Foo(); 

Выше f является ссылкой на объект типа Foo. Если вы затем функцию:

void doSomething(Foo myFoo) { ... } 

doSomething(f); 

doSomething() функция получает один и тот же объект, который f относится. Поэтому, если doSomething() мутирует f, он мутирует этот объект.

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

Одна из проблем заключается в том, что люди часто пытаются применить свои знания и терминологию на языке C++ для Java, что не сработает.

+2

Java передается по значению. Ссылки на объекты передаются по значению. – ColinD

+1

Как уже упоминал ColinD: у Java есть только один механизм для передачи объектов: «по значению». Этот ответ можно интерпретировать, что Java передает «по ссылке», что неверно. Обратите внимание, что «может быть истолковано»: я не уверен, что вы так выразились. –

+0

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

Смежные вопросы