Java - 这似乎是通过引用传递给我的

时间:2011-08-08 18:51:29

标签: java

  

可能重复:
  Is Java pass by reference?

因此,请考虑以下两个示例及其各自的输出:

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。

5 个答案:

答案 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只不过是一个对象引用。这意味着传递给方法的引用实际上是原始引用的副本。如图所示,

enter image description here