【发布时间】:2014-07-14 18:06:19
【问题描述】:
我在网站上研究 Java 参数时经常看到这种情况,但我认为我误解了它。
问题一:Is Java "pass-by-reference" or "pass-by-value"?
问题2:Does Java pass by reference?
人们一直说在java中引用类型是按值传递的,所以引用本身不会改变。而且我相信我的困惑来自“引用本身”是什么。
最初我将其解释为参数所指的内容不能以任何方式更改或修改,例如将某些内容添加到列表中。遗憾的是,这在某种程度上是错误的,并导致了有趣的结果。
当我运行下面的简单代码时,我得到了[test1, test2],所以在我看来“参考”list 发生了变化。
import java.util.ArrayList;
import java.util.List;
public class HelloWorld {
public static void main(String[] args)
{
List list = new ArrayList();
list.add("test1");
breakStuff(list);
System.out.println(list.toString());
}
public static void breakStuff( List l ) {
l.add("test2");
}
}
根据我目前对人们的意思的“想法”(Question 1 的答案),随着事情的变化,他们是错误的。我没有理解或忽略什么?
人们是否指的是您可以修改参数所引用的数据,但您不能更改参数所指的“数据/对象”?
【问题讨论】:
-
您可以更改引用的对象,但不能更改引用。
-
你可以mutate一个对象,如果它是可变的(并且
ArrayList是可变的),但是你不能让调用者中的变量引用不同的@987654328 @。传递引用的严峻考验是您是否可以编写一个swap(Object a, Object b)方法,该方法将在调用者中切换a和b。顺便说一句,你不应该使用原始类型List和ArrayList,而应该使用List<String>和ArrayList<String>。 -
这有 got 是重复的!!超过 100 次。
-
Java 中的“引用”具有特定 的含义,本质上与C 中的“指针”相同。引用是在参数列表中传递的内容。被调用者不能以调用者可见的方式更改它们(因为它们是“按值”传递的)。这与在例如教科书中使用术语“参考”不同,其中“参考”本质上是一些外部实体(例如另一本书)。
-
@PeterLawrey 感谢您一起解释双方。最初,当我在链接的问题中阅读“您可以更改引用的对象”时,我认为它们的意思是更改引用的对象,只是稍后在答案中告诉我不能。希望我现在能更好地理解术语:)