Ссылочный тип Java - PullRequest
       2

Ссылочный тип Java

3 голосов
/ 20 апреля 2010

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

Ответы [ 2 ]

10 голосов
/ 20 апреля 2010

Java передает копию ссылки на метод. Ссылка все еще указывает на тот же экземпляр.

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

Сам ресторан не дублирован, дублируется только ссылка на него.

Джон Скит приводит аналогичную аналогию :

Аналогия с баллоном

Я представляю каждый объект как гелиевый шар, каждый ссылка как кусок строки, и каждая переменная как то, что может держись за кусок веревки. Если ссылка является нулевой ссылкой, это как иметь кусок нити без все, что привязано к концу. Если это ссылка на подлинный объект, это кусок нити, привязанный к шар, представляющий этот объект. когда ссылка копируется (либо для присваивание переменной или как часть вызов метода) это как будто еще один кусок строки создается прилагается к каким бы ни был первый кусок строки прилагается к. Фактический кусок строка переменная (если есть) держаться никуда не идет - это только скопировано.

Вот пример:

// 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
}
1 голос
/ 20 апреля 2010

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

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

Foo f = new Foo();

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

void doSomething(Foo myFoo) { ... }

doSomething(f);

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

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

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

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