所以我们知道Java
使用pass by value,即它将引用的副本传递给方法。
我想知道为什么会这样,当我用原始引用(在我的例子中为param
)测试参数引用(我的例子中为string
)时,它们是否相同?
以下代码是否应该返回false
,即引用不相同,因为复制引用(即新引用)是按值传递的?
public class Interesting {
private String string;
public Interesting(final String interestig) {
super();
string = interestig; // original reference is tested against copy reference and it says they are the same
}
public boolean isItTheSame(final String param) {
return param == string;
}
public static void main(final String args[]) {
Interesting obj = new Interesting("String");
System.out.println(obj.isItTheSame(obj.string)); //copy of reference is created here
}
}
答案 0 :(得分:2)
参考变量是参考。它包含一个标识对象位置的特定位模式。这在计算机科学中称为指针。 Per the JLS,"参考值(通常只是引用)是指向这些对象的指针"。指针值(如基元)仅通过其位模式传递给方法。同样的模式意味着它们指向同一个对象。这是==
检查两个指针是否指向同一个对象的内容。这就是你得到这个结果的原因。
答案 1 :(得分:1)
不,因为==也会比较参考的值;如果两个引用都引用同一个对象,则返回true。
答案 2 :(得分:0)
引用是它自己的值。字符串"String"
位于特定的内存位置,例如0x01ab64e。因此,引用该字符串的任何引用的值都是0x01ab64e。不能引用具有不同值的字符串,因为它不会引用该字符串,它将引用不同的字符串。
“按值传递”是指按值传递引用,而不是按值传递实际引用的对象(字符串)。因此,完全相同的参考传递。这就是为什么它是一样的。
要验证引用是按值传递的,(并且该值是副本),请尝试以下操作:
String s = null;
foo( s );
assert s == null;
void foo( String s )
{
s = "not null";
}
断言不会失败,这意味着调用者持有的引用s
没有被改变。这意味着引用s
是按值传递的(它始终是副本),因此foo()
仅更改其自己的引用副本的值,使调用者的副本不受影响。< / p>