2013-02-19 50 views
0

傳球后返回相同的值我有一個代碼,下面我在哪裏交換類的FunctionInstance variablesSwapNames功能通過複製在java中

public class Sam3 
{ 
    public String FirstName, LastName; 

    public static void main(String[] args) 
    { 
     Sam3 objSam1 = new Sam3(); 
     Sam3 objSam2 = new Sam3(); 

     objSam1.FirstName = "Name1"; 
     objSam2.LastName = "Name2";   

     System.out.print(objSam1.FirstName + " " + objSam2.LastName); 

     SwapNames(objSam1, objSam2); 

     System.out.print(objSam1.FirstName + " " + objSam2.LastName); 
    } 

    public static void SwapNames(Sam3 obj1, Sam3 obj2) 
    { 
     Sam3 temp = obj2; 
     obj2 = obj1; 
     obj1 = temp; 

     obj1.FirstName = "First Name"; 
     obj2.LastName = "Last Name"; 
    } 
} 

現在代碼的輸出如下

Name1 Name2 
Name1 Name2 

我不明白的是我換了obj1 and obj2中的值 - 參考了他們的classes。之後我改變了價值。

爲什麼代碼沒有生效。

感謝您的回覆

回答

1
public static void SwapNames(Sam3 obj1, Sam3 obj2) 
{ 
    Sam3 temp = obj2; 
    obj2 = obj1; 
    obj1 = temp; 

    obj1.FirstName = "First Name"; //<-- is actually objSam2 
    obj2.LastName = "Last Name"; //<-- is actually objSam1 
} 

,看看發生了什麼事情:

class Test{ 

    public int i=2; 
} 

public class Main { 
public static void main(String[] args) { 

    Test t1 = new Test(); 
    t1.i=0; 

    Test t2 = new Test(); 
    t2.i=1; 


    System.out.println(t1.i+" "+t1); 
    System.out.println(t2.i+" "+t2); 

    test(t1,t2); 

    System.out.println(t1.i+" "+t1); 
    System.out.println(t2.i+" "+t2); 



} 

public static void test(Test a, Test b){ 
    Test swap=a; 
    a=b; 
    b=swap; 

    System.out.println(a.i+" "+a); 
    System.out.println(b.i+" "+b); 
} 

} 
/* 
output: 
0 [email protected] 
1 [email protected] 
1 [email protected] 
0 [email protected] 
0 [email protected] 
1 [email protected] 
*/ 
+0

Super.Thanks for Reply。 – 2013-02-19 18:48:03

2

在Java中的一切是按值傳遞

當你調用SwapNames(objSam1, objSam2);參考objSam1和將被複制到該方法SwapNames參數obj1obj2

所以在交換參考值obj1obj2之後將不交換objSam1和。

objSam1和仍然保持舊的參考對象。所以這不影響任何東西。


爲了更好地澄清

Sam3 temp = obj2; 
obj2 = obj1; 
obj1 = temp; 

如果打印姓&對象的名字的價值。

System.out.print(obj1.FirstName + " " + obj2.LastName); 

,你會看到的結果將是Name2 Name1

至於因爲OBJ1現在參照第二Obeject和obj2的是引用第一個對象。

+0

對不起,我編輯了我的問題 – 2013-02-19 18:43:20

+0

感謝您的回覆。如果我把objSam1.FirstName =「Name2」替換掉了它的生效。但是爲什麼如果我做了一個交換並且改變了它的值卻沒有生效 – 2013-02-19 18:45:50

+0

感謝您的回覆 – 2013-02-19 18:49:20

0

在代碼中,有兩個SAM3對象引用變量
包含SAM3類的對象。

爲objSam1 Same3的第一實例[記住SAM3
包含兩個實例變量名字,姓氏]
objSam1.FirstName = 「NAME1」;
objSam1。LastName = null; //這是缺省值,如果不設置或初始化

爲objSam2是SAM3的第二實例[記住SAM3
類包含兩個實例變量名字,姓氏]
objSam2.FirstName = NULL; //這是默認的,如果我們不初始化.FirstName
objSam2.LastName =「Name2」;

現在調用交換方法後,對象發生變化但您正在更改

objSam2.FirstName =「First Name」;
//先前姓爲空並且在.LastName沒有變化(參見上面的代碼)


objSam1.LastName =「姓」;
//以前它是空的,沒有改變.FirstName(見上面的代碼)

所以計算機給出了正確的答案。