Java 参数引用和原始引用(不是对象)有什么区别?[复制]

How is Java parameter reference and original reference (not object) the same? [duplicate]

提问人:Atti 提问时间:6/11/2017 更新时间:6/11/2017 访问量:567

问:

所以我们知道使用按值传递,即它传递对方法的引用副本。 我想知道为什么当我用原始引用(在我的示例中)测试参数引用(在我的示例中)时,它们说它们是相同的?Javaparamstring

下面的代码不应该返回,即引用不相同,因为复制引用(即新引用)是按值传递的吗?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
  }
}
java 参数 引用传递 -值

评论

1赞 Andrew Li 6/11/2017
我没有看到任何创建副本的部分?您认为哪个部分会创建副本?
0赞 Atti 6/11/2017
OCA指南是:“然后,被调用的方法会获取自己的引用变量副本,以按照自己的意愿使用它。章节 将变量传递到方法中 - OCA 目标 6.8
2赞 Tom 6/11/2017
@AndrewLi 你错了。阿提正确地引用了它。将复制引用。你认为这是说对象被复制了,但这不是这句话所说的。这就像复制一个基元值。
1赞 Tom 6/11/2017
我想知道“Java 是”按引用传递“还是”按值传递“?”仍然是一个合适的欺骗,因为它很好地涵盖了变量和引用及其行为。

答:

1赞 Michael Borgwardt 6/11/2017 #1

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

评论

0赞 Atti 6/11/2017
但它们不是同一个参考......如果我们重新分配参数引用,则原始对象将不受影响。
0赞 Tom 6/11/2017
@Atti 这是正确的,但您不会在此处重新分配任何内容。
0赞 Atti 6/11/2017
@Michael:但我认为如果我们有两个不同的参考文献并且 == 测试参考文献,那将是错误的......我在这里错过了什么?谢谢!
1赞 Michael Borgwardt 6/11/2017
@Atti:对同一对象的两个不同引用包含相同的值,就像两个不同的 int 变量可以包含相同的值一样,在这两种情况下,这些值都被认为是相等的。比较身份而不是平等的参考有什么意义?你需要它做什么?在许多情况下,两个引用引用同一个对象是一个有用的信息。
0赞 Mike Nakis 6/11/2017 #2

引用是它自己的值。0x01ab64e说,字符串位于特定的内存位置。因此,引用该字符串的任何引用的值都0x01ab64e。不能引用具有不同值的字符串,因为这样它就不会引用该字符串,而是引用不同的字符串。"String"

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

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

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

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

断言不会失败,这意味着调用方持有的引用未被更改。这意味着引用是通过值传递的,(值始终是副本),因此仅更改了其自己的引用副本的值,而调用方的副本不受影响。ssfoo()

评论

0赞 Atti 6/11/2017
但是参数(在方法中)与第一行中的参数不是不同的引用吗?sfooString s
0赞 Tom 6/11/2017
@Atti 你真的应该开始区分变量参考。两个不同的变量(如第一行和方法参数)仍然可以对堆中的同一 String 对象具有相同的引用。然后,当您这样做时,它们会有所不同。sss = "not null"foo
1赞 Atti 6/11/2017
@Mike:我明白了。谢谢你的解释!
2赞 Lew Bloch 6/11/2017 #3

引用变量是引用。它包含标识对象位置的特定位模式。这在计算机科学中被称为指针根据 JLS,“引用值(通常只是引用)是指向这些对象的指针”。指针值(如基元)仅通过其位模式传递给方法。相同的模式意味着它们指向同一个对象。这就是检查两个指针是否指向同一对象的方法。这就是你得到这个结果的原因。==