java中通过复制传递后返回相同值的函数
我有一个代码,如下所示,我正在交换java中通过复制传递后返回相同值的函数,java,Java,我有一个代码,如下所示,我正在交换函数中类的实例变量,称为SwapNames public class Sam3 { public String FirstName, LastName; public static void main(String[] args) { Sam3 objSam1 = new Sam3(); Sam3 objSam2 = new Sam3(); objSam1.FirstName
函数
中类的实例变量
,称为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和obj2
-对它们的类的引用中的值。之后,我更改了值
为什么守则没有生效
感谢您的回复在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现在引用第二个对象,而obj2引用第一个对象。在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现在引用第二个对象,而obj2引用第一个对象。在代码中,有两个Sam3对象引用变量
其中包含Sam3类的对象
对于objSam1,Same3的第一个实例[记住Sam3
包含两个实例变量FirstName,LastName]
objSam1.FirstName=“Name1”
objSam1.LastName=null;//如果您不设置或初始化,这是默认值
对于作为Sam3第二个实例的objSam2[记住Sam3
类包含两个实例变量FirstName,LastName]
objSam2.FirstName=null//如果不初始化,这是默认值。FirstName
objSam2.LastName=“Name2”
现在,在调用swap方法之后,对象被更改,但您正在更改
objSam2.FirstName=“First Name”
//以前的FirstName为null,并且.LastName中没有任何更改(请参见上面的代码)
对于
objSam1.LastName=“Last Name”
//以前它是空的,并且.FirstName(参见上面的代码)没有更改
所以计算机给出了正确的答案
在代码中,有两个Sam3对象引用变量
其中包含Sam3类的对象
对于objSam1,Same3的第一个实例[记住Sam3
包含两个实例变量FirstName,LastName]
objSam1.FirstName=“Name1”
objSam1.LastName=null;//如果您不设置或初始化,这是默认值
对于作为Sam3第二个实例的objSam2[记住Sam3
类包含两个实例变量FirstName,LastName]
objSam2.FirstName=null//如果不初始化,这是默认值。FirstName
objSam2.LastName=“Name2”
现在,在调用swap方法之后,对象被更改,但您正在更改
objSam2.FirstName=“First Name”
//以前的FirstName为null,并且.LastName中没有任何更改(请参见上面的代码)
对于
objSam1.LastName=“Last Name”
//以前它是空的,并且.FirstName(参见上面的代码)没有更改
所以计算机给出了正确的答案
谢谢您的回复。如果我把objSam1.FirstName=“Name2”放在没有交换的地方,它就会生效。但是,如果我交换并更改了值,它为什么不会生效呢?谢谢回复。如果我把objSam1.FirstName=“Name2”放在没有交换的地方,它就会生效。但是为什么如果我交换并更改了值,它就不会生效呢