我有一个代码,如下所示,我在Instance variables
中更换了Function
类SwapNames
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
的引用。之后我改变了值。
为什么代码没有生效。
感谢您的回复
答案 0 :(得分:2)
在Java中,一切都按值传递。
当您致电SwapNames(objSam1, objSam2);
引荐objSam1
时,objSam2
将被复制到方法SwapNames
参数obj1
和obj2
。
因此交换后obj1
和obj2
的参考值将被交换而不是objSam1
和objSam2
。
objSam1
和objSam2
仍然保留旧的引用对象。所以这不会影响任何事情。
为了更好地澄清
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没有变化(参见上面的代码)
所以计算机给出了正确的答案。