0

我有一个代码如下,我在调用中交换Instance variablesFunctionSwapNames

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我正在更改值。

为什么代码没有生效。

谢谢您的回复

4

3 回答 3

2

在 Java 中,一切都是按值传递的

当你调用SwapNames(objSam1, objSam2);reference时objSam1objSam2会被复制到方法SwapNames参数obj1obj2

所以在交换参考值之后obj1andobj2将被交换而不是objSam1and objSam2

objSam1并且objSam2仍然持有旧的参考对象。所以这不会影响任何事情。


为了更好地澄清

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

如果您打印对象的名字和姓氏的值。

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

你会看到结果是Name2 Name1

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

于 2013-02-19T18:41:54.650 回答
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
*/
于 2013-02-19T18:46:19.743 回答
0

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

for objSam1 first Instance of Same3 [记住 Sam3
包含两个实例变量 FirstName, LastName]
objSam1.FirstName = "Name1";
objSam1.LastName = null; // 如果你不设置或初始化,这是默认值

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

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

objSam2.FirstName = "First Name";
//以前 FirstName 为 null 并且 .LastName 没有变化(参见上面的代码)

对于
objSam1.LastName = "Last Name";
// 以前它是 null 并且 .FirstName 没有变化(见上面的代码)

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

于 2013-02-19T19:23:06.653 回答