一个很有意思的例子,大家可以进来讨论一下,这是为什么?
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”就成为垃圾了