Java参数引用和原始引用(不是对象)是如何相同的?

时间:2017-06-10 20:52:34

标签: java parameter-passing pass-by-reference pass-by-value

所以我们知道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
  }
}

3 个答案:

答案 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>