2011-08-08 7 views
4

可能性の重複:Javaは - これは私を参照して、パスのように思える

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; 
    } 
} 

出力:
Is Java pass by reference?

だから次の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

これはなぜこれが私にpassbyvalueようには見えませんwww.yahoo.com?だろう。

+0

参照:http://stackoverflow.com/questions/40480/is-java-pass-by-reference –

答えて

10

参照は値渡しです。しかし、新しいリファレンスはまだ同じ元のオブジェクトを指しています。だからあなたはそれを修正する。 Integerの最初の例では、参照先のオブジェクトを変更しています。オリジナルのものは変更されません。

1

これは値渡しですが、値はプロパティへの参照であり、変更しないで、内部フィールドのみを変更します。

最初のケースでは参照のメンバーではなく参照を変更しますが、2番目の場合は参照のメンバーを変更しますが、参照はそのままのままにします。

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) 

と同じであること。 Integerで値を設定できる場合は、次のようにします。

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

これは、2番目の例が行ったこととまったく同じでした。

関連する問題