可能重复:
就是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 ++(或out
/ ref
在C#)。
你可能在想的对象引用,这是一个完全独立使用单词“参考”的比通通过引用的“参考”的。 让我们来看看在使用对象的例子:
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
),在==
在foo
会是假的。 但它不是,也没有办法让它如此。
对象引用允许您更改传递给函数的对象的状态 ,但你不能改变它包含在调用函数的变量。
Java的始终是“值传递”。 因此,原语和对象的(参考)两者都按值传递。
编辑
是啊,对象不是直接传递,我们总是指他们与他们的参考。 所以对象的引用是按值传递。