2012-08-23 46 views
0

Java中的以下代碼有什麼區別?我無法清楚地瞭解Java中如何傳遞對象。任何人都可以解釋下面的代碼。Pass對象Java

package cc; 

public class C { 

    public static class Value { 
     private String value; 

     public void setValue(String str) { 
      value=str; 
     } 

     public String getValue() { 
      return value; 
     } 
    } 



    public static void test(Value str) { 
     str.setValue("test"); 
    } 

    public static void test2(Value str) { 
     str=new Value(); 
     str.setValue("test2"); 
    } 
    public static void main(String[] args) { 
     String m="main"; 
     Value v=new Value(); 
     v.setValue(m); 
     System.out.println(v.getValue()); // prints main fine 
     test(v); 
     System.out.println(v.getValue()); // prints 'test' fine 
     test2(v); 
     System.out.println(v.getValue()); // prints 'test' again after assigning to test2 in function why? 
    } 
} 
+0

Java是*通過值*。通過參數'str'將'v'的引用值從'main'傳遞到'test2'中,當'str'被分配給一個新的引用時這個參數丟失了。 – oldrinb

+0

[Java是否爲「通過引用傳遞」?](http://stackoverflow.com/questions/40480/is-java-pass-by-reference) – adatapost

回答

3

test2()一個新的實例被創建,並且您在新的情況下,而不是在其引用傳遞

public static void test2(Value str) { 
     str=new Value(); 
     str.setValue("test2"); 
} 

請參見

+0

它可以。但是不應該傳遞的引用應該指向在test2()內創建的新對象嗎?它仍然指向舊對象,即使我們在函數內部進行了更改。那是我無法清楚地理解的事情? –

+0

不僅參考值被複制到新的參考變量,所以仍然v從主要點到在main中創建的對象,v(參考)它的值被複制到str,然後在創建'new價值()' –

+0

雅我知道了,謝謝你..你有沒有投下這個問題? –

1

當您將v轉換爲test2時,您實際上正在做的是將副本的參考文獻指向v並將其指定爲方法 - 將其視爲具有與v相同值的新變量。

當你分配一個新的Value對象strtest2你分配一個新的值參考的副本 - 你原來的參考,其內部存在main是該重新分配的影響,而且還指的是原來的對象。

當你執行你的第三mainprintln你還在使用原始的Value對象,而不是在內部test2創建新的,所以你看test而不是test2打印出來。

0

在java中,對象是按值傳遞的。它將v2的引用複製到str。 雖然您創建了一個新對象並分配給了str,但str是test2方法範圍內的局部變量。 test2方法中只有str被改變。

public static void test2(Value str) { 
    str=new Value(); 
    str.setValue("test2"); 
    System.out.println(str.getValue()); 
} 
0

在你的函數test()你逝去的Value對象,並設置該對象的一些字符串。

public static void test(Value str) { 
    str.setValue("test"); 
} 

所以,當你打印System.out.println(v.getValue());它會給你test作爲輸出。

接下來你打電話test2()它創建一個新的實例Value,你正在設置新的實例值。但不在傳入的對象中,因此新創建的對象中的值爲test2,舊對象中的值仍爲test