2011-08-08 37 views
4

可能重复:
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; 
    } 
} 

输出:


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

另请参阅:http://stackoverflow.com/questions/40480/is-java-pass-by-reference – 2011-08-08 18:57:41

回答

10

参考是通过值。但新的参考仍然指向相同的原始对象。所以你修改它。在Integer的第一个示例中,您正在更改参考点所指向的对象。所以原来的一个没有修改。

1

这是按值传递,但值是对属性的引用,并且不会更改它,只是它的一些内部字段。

在第一种情况下,您更改引用而不是引用的任何成员,而在第二种情况下,您更改引用的成员,但保留引用的原样。

0

这是因为properties2只不过是一个对象引用。这意味着传递给该方法的引用实际上是原始引用的副本。由于这说明,

enter image description here

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”。

您实际上正在传递参考文献的值,因此可以看到通过该参考对对象所做的更改。但是,如果您为参数指定了新的对象引用,那么该更改将反映而不是,因为您只通过参考值,而不是实际参考变量。

2

你的第一个例子做:

num = 2 

这是一样的

num = new Integer(2) 

所以你看它是如何是不太一样的你的第二个例子。如果整数让你设置它的值,你可以这样做:

num.setValue(2) // I know Integer doesn't allow this, but imagine it did. 

这将完成第二个例子。