提问人:Atti 提问时间:6/11/2017 更新时间:6/11/2017 访问量:567
Java 参数引用和原始引用(不是对象)有什么区别?[复制]
How is Java parameter reference and original reference (not object) the same? [duplicate]
问:
所以我们知道使用按值传递,即它传递对方法的引用副本。
我想知道为什么当我用原始引用(在我的示例中)测试参数引用(在我的示例中)时,它们说它们是相同的?Java
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
}
}
答:
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";
}
断言不会失败,这意味着调用方持有的引用未被更改。这意味着引用是通过值传递的,(值始终是副本),因此仅更改了其自己的引用副本的值,而调用方的副本不受影响。s
s
foo()
评论
0赞
Atti
6/11/2017
但是参数(在方法中)与第一行中的参数不是不同的引用吗?s
foo
String s
0赞
Tom
6/11/2017
@Atti 你真的应该开始区分变量和参考。两个不同的变量(如第一行和方法参数)仍然可以对堆中的同一 String 对象具有相同的引用。然后,当您这样做时,它们会有所不同。s
s
s = "not null"
foo
1赞
Atti
6/11/2017
@Mike:我明白了。谢谢你的解释!
2赞
Lew Bloch
6/11/2017
#3
引用变量是引用。它包含标识对象位置的特定位模式。这在计算机科学中被称为指针。根据 JLS,“引用值(通常只是引用)是指向这些对象的指针”。指针值(如基元)仅通过其位模式传递给方法。相同的模式意味着它们指向同一个对象。这就是检查两个指针是否指向同一对象的方法。这就是你得到这个结果的原因。==
评论