Java 参数引用和原始引用(不是对象)如何相同?
How is Java parameter reference and original reference (not object) the same?
所以我们知道 Java
使用按值传递,即它将引用的副本传递给方法。
我想知道为什么当我测试参数引用(param
在我的示例中)与原始引用(string
在我的示例中)时说它们是相同的?
下面的代码不应该return 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
}
}
不,因为 == 也会比较引用的 value;如果两个引用都引用同一个对象,则返回 true。
引用是它自己的值。字符串 "String"
位于特定的内存位置,比如 0x01ab64e。因此,引用该字符串的任何引用的值为 0x01ab64e。不能引用具有不同值的那个字符串,因为那样它就不会引用那个字符串,而是引用另一个字符串。
"Pass by value"指的是按值传递引用,而不是按值传递实际引用的对象(字符串)。因此,传递了完全相同的引用。这就是为什么它是一样的。
要验证引用是否按值传递(并且该值是一个副本),试试这个:
String s = null;
foo( s );
assert s == null;
void foo( String s )
{
s = "not null";
}
断言没有失败,这意味着调用者持有的引用 s
没有被更改。这意味着引用 s
是按值传递的(它始终是一个副本),因此 foo()
只更改了它自己的引用副本的值,而调用者的副本不受影响。
引用变量是引用。它包含一个特定的位模式,用于标识对象的位置。这在计算机科学中被称为指针。 Per the JLS、"reference values (often just references) are pointers to these objects"。指针值与原始值一样,仅通过其位模式传递给方法。相同的模式意味着它们指向同一个对象。这就是 ==
检查的内容,两个指针是否指向同一个对象。这就是你得到那个结果的原因。
所以我们知道 Java
使用按值传递,即它将引用的副本传递给方法。
我想知道为什么当我测试参数引用(param
在我的示例中)与原始引用(string
在我的示例中)时说它们是相同的?
下面的代码不应该return 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
}
}
不,因为 == 也会比较引用的 value;如果两个引用都引用同一个对象,则返回 true。
引用是它自己的值。字符串 "String"
位于特定的内存位置,比如 0x01ab64e。因此,引用该字符串的任何引用的值为 0x01ab64e。不能引用具有不同值的那个字符串,因为那样它就不会引用那个字符串,而是引用另一个字符串。
"Pass by value"指的是按值传递引用,而不是按值传递实际引用的对象(字符串)。因此,传递了完全相同的引用。这就是为什么它是一样的。
要验证引用是否按值传递(并且该值是一个副本),试试这个:
String s = null;
foo( s );
assert s == null;
void foo( String s )
{
s = "not null";
}
断言没有失败,这意味着调用者持有的引用 s
没有被更改。这意味着引用 s
是按值传递的(它始终是一个副本),因此 foo()
只更改了它自己的引用副本的值,而调用者的副本不受影响。
引用变量是引用。它包含一个特定的位模式,用于标识对象的位置。这在计算机科学中被称为指针。 Per the JLS、"reference values (often just references) are pointers to these objects"。指针值与原始值一样,仅通过其位模式传递给方法。相同的模式意味着它们指向同一个对象。这就是 ==
检查的内容,两个指针是否指向同一个对象。这就是你得到那个结果的原因。