函数在java中复制后返回相同的值

时间:2013-02-19 18:39:24

标签: java

我有一个代码,如下所示,我在Instance variables中更换了FunctionSwapNames

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的引用。之后我改变了值。

为什么代码没有生效。

感谢您的回复

3 个答案:

答案 0 :(得分:2)

在Java中,一切都按值传递

当您致电SwapNames(objSam1, objSam2);引荐objSam1时,objSam2将被复制到方法SwapNames参数obj1obj2

因此交换后obj1obj2的参考值将被交换而不是objSam1objSam2

objSam1objSam2仍然保留旧的引用对象。所以这不会影响任何事情。


为了更好地澄清

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

如果您打印FirstName&的值对象的LastName。

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

您会看到结果为Name2 Name1

因为obj1现在正在引用第二个Obeject,而obj2正在引用第一个对象。

答案 1 :(得分: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 Test@3c56b64c
1 Test@60da5686
1 Test@60da5686
0 Test@3c56b64c
0 Test@3c56b64c
1 Test@60da5686
*/

答案 2 :(得分:0)

在您的代码中,有两个Sam3对象引用变量
其中包含Sam3类的对象。

for objSam1第一个Same3实例[记住Sam3
包含两个实例变量FirstName,LastName]
    objSam1.FirstName =“Name1”;
    objSam1.LastName = null; //如果您未设置或初始化

,则这是默认值

对于objSam2这是Sam3的第二个实例[记得Sam3
  class包含两个实例变量FirstName,LastName]
  objSam2.FirstName = null; //如果我们不初始化.FirstName,这是默认的   objSam2.LastName =“Name2”;

现在调用交换方法对象后,但您正在更改

   objSam2.FirstName =“名字”;
//以前的FirstName为null,且.LastName没有变化(见上面的代码)

和    objSam1.LastName =“姓氏”;
//以前它是null并且.FirstName没有变化(参见上面的代码)

所以计算机给出了正确的答案。