2011-12-15 5 views
-1

Можно создать дубликат:
Is Java pass by reference?Пройдите по значению или ссылке. Простое представление

После прочтения дискуссии на эту тему, можно делать вывод, что когда Java передает переменную, скажем A (за исключением примитивного типа), это означает, он передает объект, к которому относится переменная (A). Таким образом, любые изменения, сделанные на этом объекте, отражаются в переменной (A). Так, наконец, он работает как пропуск по ссылке в общем терминах?

+2

Ссылка на A передается по значению. Изменения, внесенные вами в метод A, являются локальными только для этого метода. Отличная запись на эту тему можно найти здесь [http://javadude.com/articles/passbyvalue.htm) – CoolBeans

+0

Эта вещь, как и везде. –

ответ

1

Нет, это неправильно.

Все передано по значению в JAVA - никаких исключений!

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

+0

Почему мы не можем просто согласиться на совместное использование вызовов (для ссылочных типов) и ладить? : Р ~ –

0

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

void foo(Object obj) { 
    foo = new Object(); 
} 

Object obj = new Object(); 
Object obj2 = obj; 
foo(obj2); 
System.out.println("obj2 passed by " + (obj == obj2 ? "value" : "reference")); 

Этот код напечатает «pass by value».

1

См Is Java "pass-by-reference" or "pass-by-value"?

Java всегда calls-by-value. В случае, когда объекты передаются, он передает «значение ссылки», которое дает Java семантику call-by-object-sharing (она делает это через значение по умолчанию -of-reference-хотя!).

Я хотел бы сказать: Когда объект передан, он не копируется. Тогда, поскольку он является одним и тем же объектом внутри метода - переменная - это просто другое «имя» для него - если вы изменяете объект (не переменную!) внутри метода, вы меняете этот объект снаружи - везде, действительно - также. (Это тот же самый объект, и все :-)

Обратите внимание, что переменные не передаются. Они оцениваются как выражение и передаются значения , которые они оценивают.

Некоторые языки, такие как поддержка C++ call-by-reference. Это разные, чем вызов по значению или совместное использование вызовов, потому что эти функции вызываются с (как правило, ограниченным набором) «lvalues» в качестве аргументов и переназначением параметров в функции влияет на « lvalues ​​"снаружи. «lvalues» обычно являются переменными, и поддержка такого соглашения о вызове отличается языком (многие его не поддерживают!).

Счастливое кодирование.

1

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

Обратите внимание на то, что многие люди путают «ссылочную» терминологию относительно ссылок Java на объекты и проходят по ссылочной семантике вызова. Дело в том, что при обращении к ссылкам Java к объектам копия значения ссылки - это то, что передается методу - оно передается по значению. Это, например, почему вы не можете мутировать (оригинальную, вызывающую) ссылку на объект из вызываемого метода.

"pass by reference" означает, что если вы передадите переменную в метод, ее значение можно изменить. Это возможно на многих языках, таких как Pascal, Ada и C++, но not in many other languages like C and Java.

вот хорошее обсуждение. http://www.jguru.com/faq/view.jsp?EID=430996

0

заключение я хотел бы больше вдоль линий:

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

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