一个很有意思的例子,大家可以进来讨论一下,这是为什么?

sureyor 2007-08-03 05:38:59
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]);
}
}

//猜猜结果输出的是什么?
...全文
402 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
piglet8792 2007-08-10
  • 打赏
  • 举报
回复
6.6
KingNE 2007-08-06
  • 打赏
  • 举报
回复
01
qqqwwwqw 2007-08-06
  • 打赏
  • 举报
回复
谢谢!!!
aa0123 2007-08-06
  • 打赏
  • 举报
回复
每次赋值都new了一个新的String出来
比如
string str1="111";
str1="222";
执行这两句的意思是,在内存新new一个区域给“222”,然后str1是指向那个新的内存区“222”,而原来的内存区“111”就成为垃圾了
malligator 2007-08-06
  • 打赏
  • 举报
回复
........
lingling295 2007-08-05
  • 打赏
  • 举报
回复
java中的String是immutable的,每一次改变字符串都是新生成一个String实例
----------------------------------------------------------------------
正解,相当于每次赋值都new了一个新的String出来
shujianhua 2007-08-03
  • 打赏
  • 举报
回复
不懂,等我回去运行一下先,哈。。。
killme2008 2007-08-03
  • 打赏
  • 举报
回复
java中的String是immutable的,每一次改变字符串都是新生成一个String实例
qqqwwwqw 2007-08-03
  • 打赏
  • 举报
回复
下面这个为什么没有发生改变,请赐教

public class Pass {
public void setValue(String str1) {

System.out.println("str1 = "+str1);
str1 = "2222";
System.out.println("str1 = "+str1);
str1 = null;
}

public static void main(String[] args) {
Pass pass = new Pass();
String str = "111";
System.out.println("before setValue str is " + str);
pass.setValue(str);
System.out.println("acton setValue str is " + str);
}
}
sureyor 2007-08-03
  • 打赏
  • 举报
回复
killme2008(www.rubyeye.net):
"可数组还在那里,被main中的引用ab指向着"
这句话没有说得太清晰

ChDw(米):
"这里改变的是ab所指向对象中的内容,所以外部的ab也会产生变化"
这句话也感觉稍稍有点问题

main中的ab其实一直都没有变化,变化的只是它们所指向的内容
sureyor 2007-08-03
  • 打赏
  • 举报
回复
等大家讨论讨论再出来嘛,一开始就把结果都说出来啦,-_-!!
sureyor 2007-08-03
  • 打赏
  • 举报
回复
几个带星的抢得太快啦,一点意思都没有...
idealistic33 2007-08-03
  • 打赏
  • 举报
回复
side effect, bad design
haidifotiaoqiang 2007-08-03
  • 打赏
  • 举报
回复
呵呵,有意思
SDMRauquin 2007-08-03
  • 打赏
  • 举报
回复
上面的打字速度的确快,脑子也快。佩服
SDMRauquin 2007-08-03
  • 打赏
  • 举报
回复
简单:
0
1
killme2008 2007-08-03
  • 打赏
  • 举报
回复
显然,输出肯定是
0
1
ChDw 2007-08-03
  • 打赏
  • 举报
回复
当然是0 ,1。这个哪里需要猜!

ab[0] = 0;//这里改变的是ab所指向对象中的内容,所以外部的ab也会产生变化
ab[1] = 1;
ab = null;//这里改变的是ab的指向,ab已经指向了null,但是外部的ab指向不发生变化,原对象的值并没有发生变化
killme2008 2007-08-03
  • 打赏
  • 举报
回复
方法setValue中的ab是一个引用(main中的ab)的拷贝,与main中的ab一样,
都是指向同一个数组

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

验证了:java的参数传递是传值,
对于基本类型,就是值的拷贝,对于引用类型,就是引用的拷贝。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧