日期:2014-05-20  浏览次数:20833 次

java中的传值与传reference
class   Number   {  
      int   i;  
}  

public   class   Assignment   {  
      public   static   void   main(String[]   args)   {  
Number   n1   =   new   Number();  
Number   n2   =   new   Number();  
n1.i   =   9;  
n2.i   =   47;  
System.out.println( "1:   n1.i=   "   +   n1.i   +   ",   n2.i=   "   +   n2.i);  
n1   =   n2;  
System.out.println( "2:   n1.i=   "   +   n1.i   +   ",   n2.i=   "   +   n2.i);  
n1.i   =   27;  
System.out.println( "3:   n1.i=   "   +   n1.i   +   ",   n2.i=   "   +   n2.i);  
        }  
}  

这段代码输出的结果是什么?最后一个输出语句为什么输出这种情况,请大家亲自操作一下再来回答,谢谢

------解决方案--------------------
n1 = n2; 传的是引用。
实例化对象时,对象和属性的值放到不同的内存空间。
n1.i = 27; 这样值都变为27了。
------解决方案--------------------
1: n1.i= 9, n2.i= 47
2: n1.i= 47, n2.i= 47
3: n1.i= 27, n2.i= 27

Java中,都是传值调用,而不是传址调用,
n1 = n2;
表示,n1指向了n2对象的引用, 就是n1,n2指向内存中同一个实体,
既一个类创建的两个对象,如果具有相同的引用,那么就具有完全相同的实体,


------解决方案--------------------
n1 = n2;
后引用n1, n2都指向同一个对象了, 所以修改引用n1指向的对象, 结果就是一样的了

楼主需要理解引用和对象之间的区别, new的对象一般在堆里面, 而引用是放在栈里面, 相当于编译原理里面的符号表, 指向创建的对象
------解决方案--------------------
n1 = n2;
执行后,n1,n2都指向原来n2指向的对象。
n1.i = 27;
执行后,n1,n2的内容都修改,因为它们本来就已经指向同一个对象了。
所以输出结果都应该是27。
------解决方案--------------------
看来我来晚了。