关于传值和传引用的问题
public class SwaperTest{
public void swap1(int a,int b){
int temp=0;
temp=a;
a=b;
b=temp;
}
public void swap2(Integer i1,Integer i2){
Integer temp=null;
temp=i1;
System.out.println(temp);
i1=i2;
System.out.println(i1+ "\t "+i2);
i2=temp;
System.out.println(i1+ "\t "+i2);
}
public static void main(String[] args){
int num1=10;
int num2=20;
Integer n1=new Integer(num1);
Integer n2=new Integer(num2);
SwaperTest st=new SwaperTest();
st.swap1(num1,num2);
System.out.println (num1+ " "+num2);
st.swap2(n1,n2);
System.out.println (n1+ " "+n2);
}
}
打印结果为: 10 20
10 20
public class SwaperTest2{
public int num=10;
}
class Swap{
public void swapMethod1(int num1,int num2){
int temp=0;
temp=num1;
num1=num2;
num2=temp;
}
public void swapMethod2(SwaperTest2 st1,SwaperTest2 st2){
int temp=0;
temp=st1.num;
st1.num=st2.num;
st2.num=temp;
}
}
class Tester{
public static void main(String[] args){
SwaperTest2 st1=new SwaperTest2();st1.num=20;
SwaperTest2 st2=new SwaperTest2();st2.num=40;
Swap s=new Swap();
s.swapMethod1(st1.num,st2.num);
System.out.println(st1.num+ " "+st2.num);
s.swapMethod2(st1,st2);
System.out.println(st1.num+ " "+st2.num);
}
}
打印结果为: 20 40
40 20
请大侠解释,谢谢!
[解决办法]
学过C++都知道应用其实就是简化的指针,所以引用本省是个地址,这和他所指向的对象是不同的,其函数实传值和传地址传入的都是拷贝并不是本省,举个例子看看。
(1) 定义两格对象
Integer n1=new Integer(1); n1-> 对象1 (-> 表示指向)
Integer n2=new Integer(2); n2-> 对象2
(2)传入函数swap(n1,n2)
这时只是复制了n1,n2引用,对象1和对象2没有复制。
(3) 当交换的时候只是交换了复制后的n1,n2的指向(这里复制后用n1 ',n2 '表示)
这时 n1 '-> 对象2 n2 '-> 对象1
这里很关键注意:函数交换的是n1,n2的复制你n1 ',n2 ',n1,n2本省没有交换,对象1,对
象2也没有变化.
(4) 函数退出n1 ',n2 '也消失了,n1,n2仍然指向的是原来的值
[解决办法]
注意 你第二个例子里面交换的是对象的一个属性值,而第一个例子交换的是对象的引用变量(这里都是说的是你两个例子里面用对象作形参的方法):
第一个例子:
temp=i1;
i1=i2;
i2=temp;
这里的论述 支持yczz(飞鸟)的论述
第二个例子:
(1) 定义两个对象
SwaperTest2 st1=new SwaperTest2();st1.num=20;
SwaperTest2 st2=new SwaperTest2();st2.num=40;
(2)传入函数swapMethod2(st1,st2)
同例一 这里复制了st1,st2引用,我们称形参为st1 '和st2 '。即st1 '等同于st1,st2 '等同st2(同一个内存空间实体)。
(3)temp=st1 '.num;st1 '.num=st2 '.num;st2 '.num=temp; (这种写法是不对的, '只是为了区别)
这里要注意,与例一不同,函数交换的是st1 ',st2 '的一个属性num(也即时原来st1和st2的num属性),而不是函数的局部参数值
(4) 函数退出st1 ',st2 '消失了,n1,n2仍然指向的是原来的值,但是这时它们的属性num被交换了的(两个对象的num属性也一直存在的)
画一个图就很容易理解 不过贴不出图来 你就记着引用型的参数传递 形参会初始化为与实参指向同一个对象 但形参本身会在函数结束后消失 但是 用形参引用对对应对象所作的修改会延续下来