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

Java参数引用和原始引用(不是对象)如何相同?,java,parameter-passing,pass-by-reference,pass-by-value,Java,Parameter Passing,Pass By Reference,Pass By Value,因此我们知道Java使用passby value,即它将引用的副本传递给方法。 我想知道为什么,当我测试参数引用(param在我的示例中)和原始引用(string在我的示例中)时,会说它们是相同的 下列代码不应该返回false,即引用不相同,因为复制引用(即新引用)是按值传递的吗 public class Interesting { private String string; public Interesting(final String interestig) { sup

因此我们知道
Java
使用passby 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
  }
}

否,因为==也比较引用的值;如果两个引用引用同一个对象,则返回true。

否,因为==也比较引用的值;如果两个引用都引用同一个对象,则生成true。

引用是其自身的值。字符串
“字符串”
位于特定的内存位置,例如0x01ab64e。因此,引用该字符串的任何引用的值都是0x01ab64e。不能用不同的值引用该字符串,因为这样它将不会引用该字符串,而是引用不同的字符串

“按值传递”是指按值传递引用,而不是按值传递实际引用的对象(字符串)。因此,传递了完全相同的引用。这就是为什么它是一样的

要验证引用是否按值传递(并且该值是否为副本),请尝试以下操作:

String s = null;
foo( s );
assert s == null;

void foo( String s )
{
    s = "not null";
}

断言没有失败,这意味着调用方持有的引用
s
没有被更改。这意味着引用
s
是通过值传递的(它始终是一个副本),因此
foo()
只更改了它自己的引用副本的值,而不影响调用方的副本。

引用是它自己的值。字符串
“字符串”
位于特定的内存位置,例如0x01ab64e。因此,引用该字符串的任何引用的值都是0x01ab64e。不能用不同的值引用该字符串,因为这样它将不会引用该字符串,而是引用不同的字符串

“按值传递”是指按值传递引用,而不是按值传递实际引用的对象(字符串)。因此,传递了完全相同的引用。这就是为什么它是一样的

要验证引用是否按值传递(并且该值是否为副本),请尝试以下操作:

String s = null;
foo( s );
assert s == null;

void foo( String s )
{
    s = "not null";
}

断言没有失败,这意味着调用方持有的引用
s
没有被更改。这意味着引用
s
是通过值传递的(它始终是一个副本),因此
foo()
只更改了它自己的引用副本的值,使调用方的副本不受影响。

引用变量是一个引用。它包含一个特定的位模式​ 标识对象位置的。这在计算机科学中被称为指针,“引用值(通常只是引用)是指向这些对象的指针”。指针值和原语一样,只通过它们的位模式传递给方法。相同的图案意味着它们指向相同的对象。这就是
==
检查的内容,两个指针是否指向同一个对象。这就是为什么会得到这个结果。

引用变量就是引用。它包含一个特定的位模式​ 标识对象位置的。这在计算机科学中被称为指针,“引用值(通常只是引用)是指向这些对象的指针”。指针值和原语一样,只通过它们的位模式传递给方法。相同的图案意味着它们指向相同的对象。这就是
==
检查的内容,两个指针是否指向同一个对象。这就是为什么会得到这样的结果。

我没有看到任何创建副本的部分?你认为哪一部分会创建一个副本?OCA指南是这样做的:“然后被调用的方法会得到它自己的引用变量副本,以根据自己的喜好来处理它。”将变量传递到方法中的章节-OCA目标6。8@AndrewLi你错了。阿蒂正确地引用了它。引用被复制。你认为这是说,该对象是复制的,但这不是这句话所说的。这就像复制一个原语值。我想知道“”是否仍然是一个合适的副本,因为它很好地涵盖了变量和引用及其行为。我没有看到任何创建副本的部分?你认为哪一部分会创建一个副本?OCA指南是这样做的:“然后被调用的方法会得到它自己的引用变量副本,以根据自己的喜好来处理它。”将变量传递到方法中的章节-OCA目标6。8@AndrewLi你错了。阿蒂正确地引用了它。引用被复制。你认为这是说,该对象是复制的,但这不是这句话所说的。这就像复制一个原语值。我想知道“”是否仍然是一个合适的副本,因为它很好地涵盖了变量和引用及其行为。但它们不是相同的引用。。。如果我们重新分配参数引用,原始对象将不会受到影响。@Atti这是正确的,但您在这里不重新分配任何内容。@Michael:但我认为如果我们有两个不同的引用,并且==测试引用,那么它将是错误的。。。我错过了什么?谢谢@Atti:对同一对象的两个不同引用包含相同的值,就像两个不同的int变量可以包含相同的值一样,在这两种情况下,值被认为是相等的。甚至比较同一性而不是平等性的参考文献有什么意义?你需要它做什么?在许多情况下,两个引用引用同一个对象是有用的信息。但它们不是相同的引用。。。如果我们重新分配参数引用,原始对象将不会受到影响。@Atti这是正确的,但您在这里不重新分配任何内容。@Michael:但我认为如果我们有两个不同的引用,并且==测试引用,那么它将是错误的。。。我错过了什么