因此,请考虑以下两个示例及其各自的输出:
public class LooksLikePassByValue {
public static void main(String[] args) {
Integer num = 1;
change(num);
System.out.println(num);
}
public static void change(Integer num)
{
num = 2;
}
}
输出:
1
public class LooksLikePassByReference {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("url", "www.google.com");
change(properties);
System.out.println(properties.getProperty("url"));
}
public static void change(Properties properties2)
{
properties2.setProperty("url", "www.yahoo.com");
}
}
输出:
www.yahoo.com
为什么会www.yahoo.com?
这对我来说看起来不像passbyvalue。
答案 0 :(得分:10)
引用按值传递。但新引用仍然指向相同原始对象。所以你修改它。在您使用Integer
的第一个示例中,您正在更改引用指向的对象。所以原来的没有被修改。
答案 1 :(得分:2)
你的第一个例子是:
num = 2
与
相同num = new Integer(2)
所以你看到它和你的第二个例子不太一样。如果整数让你设置它的值,你可以做到:
num.setValue(2) // I know Integer doesn't allow this, but imagine it did.
这与第二个例子完全相同。
答案 2 :(得分:1)
这是按值传递,但该值是对属性的引用,并且您不会更改它,只会更改它的某些内部字段。
在第一种情况下,您更改引用,而不是引用的任何成员,而在第二种情况下,您更改引用的成员,但保留引用不变。
答案 3 :(得分:1)
试试这个:
public class LooksLikePassByReference {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("url", "www.google.com");
change(properties);
System.out.println(properties.getProperty("url"));
}
public static void change(Properties properties2)
{
properties2 = new Properties();
properties2.setProperty("url", "www.yahoo.com");
}
}
打印出“www.google.com”。
您实际上正在传递引用的值,因此将会看到通过该引用对对象所做的更改。但是,如果为参数指定了新的对象引用,则该更改将不反映出来,因为您只传递了引用的值,而不是实际的引用变量。
答案 4 :(得分:0)
那是因为properties2
只不过是一个对象引用。这意味着传递给方法的引用实际上是原始引用的副本。如图所示,