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

一个很有意思的例子,大家可以进来讨论一下,这是为什么?
public   class   Pass   {        
    public   void   setValue(int[]   ab)   {        
        ab[0]   =   0;
        ab[1]   =   1;
        ab   =   null;
    }        
   
    public   static   void   main(String[]   args)   {      
Pass   pass   =   new   Pass();
int[]   ab   =   new   int[2];
ab[0]   =   3;
ab[1]   =   4;
pass.setValue(ab);
System.out.println(ab[0]);
System.out.println(ab[1]);
    }        
}        

//猜猜结果输出的是什么?

------解决方案--------------------
方法setValue中的ab是一个引用(main中的ab)的拷贝,与main中的ab一样,
都是指向同一个数组

因此
ab[0]=0;
ab[1]=1;
就会修改指向的数组元素。而ab=null,也仅仅是将这个引用的拷贝设置为null,它
现在不指向任何东西,可数组还在那里,被main中的引用ab指向着

验证了:java的参数传递是传值,
对于基本类型,就是值的拷贝,对于引用类型,就是引用的拷贝。
------解决方案--------------------
当然是0 ,1。这个哪里需要猜!

ab[0] = 0;//这里改变的是ab所指向对象中的内容,所以外部的ab也会产生变化
ab[1] = 1;
ab = null;//这里改变的是ab的指向,ab已经指向了null,但是外部的ab指向不发生变化,原对象的值并没有发生变化
------解决方案--------------------
简单:
0
1

------解决方案--------------------
java中的String是immutable的,每一次改变字符串都是新生成一个String实例
----------------------------------
正解,相当于每次赋值都new了一个新的String出来
------解决方案--------------------
每次赋值都new了一个新的String出来
比如
string str1= "111 ";
str1= "222 ";
执行这两句的意思是,在内存新new一个区域给“222”,然后str1是指向那个新的内存区“222”,而原来的内存区“111”就成为垃圾了