可能的重复:
Java 是“按引用传递”吗?
也许我遗漏了一些东西......但我真的不明白为什么Java同时使用按值传递和按引用传递。为什么不只使用一种范式?
可能的重复:
Java 是“按引用传递”吗?
也许我遗漏了一些东西......但我真的不明白为什么Java同时使用按值传递和按引用传递。为什么不只使用一种范式?
它没有。Java 纯粹是按值传递。处理对象时传递的值是对象引用,但这与“按引用传递”无关。
引用传递意味着函数可以传递一个变量并在调用函数中更改该变量的内容。这在 Java 中不存在。
例如:
void foo() {
int a;
a = 42;
bar(a);
System.out.println(a); // Will ALWAYS be 42
}
void bar(int b) {
b = 67;
}
与确实具有传递引用的C++ 相比:
// C++ code
void foo() {
int a;
a = 42;
bar(a);
cout << a; // 67?!
}
void bar(int& a) { // <== Note the &
a = 67;
}
Java 没有&
C++ 中的(或C# 中的out
/ )等价物。ref
您可能正在考虑对象引用,这是对“引用”一词的完全独立的使用,而不是通过引用传递中的“引用”。让我们看一个带有对象的示例:
void foo() {
Object o1, o2;
o1 = new Object();
o2 = o1;
bar(o1);
System.out.println(o1 == o2); // Will ALWAYS be true
}
void bar(Object o) {
o = new Object();
}
如果 Java 有按引用传递(并且我们使用它来将对象变量传递给bar
),那么==
infoo
将是错误的。但事实并非如此,也没有办法做到这一点。
对象引用允许您更改传递给函数的对象的状态,但不能更改调用函数中包含它的变量。
Java 始终是“按值传递”。所以原语和对象的(引用)都是按值传递的。
编辑
是的,对象不是直接传递的,我们总是用它们的引用来引用它们。所以Object的引用是按值传递的。