首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于传值和传引用的有关问题

2012-01-22 
关于传值和传引用的问题publicclassSwaperTest{publicvoidswap1(inta,intb){inttemp0tempaabbtemp

关于传值和传引用的问题
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属性也一直存在的)

画一个图就很容易理解 不过贴不出图来 你就记着引用型的参数传递 形参会初始化为与实参指向同一个对象 但形参本身会在函数结束后消失 但是 用形参引用对对应对象所作的修改会延续下来

热点排行