精华帖 (0) :: 良好帖 (13) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-06-28
JE帐号 写道 ... ... 两段代码,又不相似.没什么可对比的,如果第二段代码的method方法为以下 static void method(String[] a){//12 a = new String[]{"1","2"}; } 在这种情况下如果两段代码结果表现不一样,才有意思. 现在你两个例子里,一个是对传入的参数进行=操作,另一个是对传入的参数里的元素进行=操作.这又什么好对比的? 是呀,Java对象、简单类型的数组均是传址的,简单类型(含string)都是传值的。这个不难理解。用过C语言指针的理解起来无须费力。还画个图搞这么复杂干嘛呀? |
|
返回顶楼 | |
发表时间:2011-06-28
发的文章不进行过滤吗?两段代码根本没有可比性啊!
|
|
返回顶楼 | |
发表时间:2011-06-28
牢记pass by value就行了吧,这个应该不用分析堆栈的吧
|
|
返回顶楼 | |
发表时间:2011-06-28
brown802 写道 发的文章不进行过滤吗?两段代码根本没有可比性啊!
的确,2段代码中处理的方式都不一样,一个是new,一个是重新赋值。 |
|
返回顶楼 | |
发表时间:2011-06-28
i.phoenix 写道 JE帐号 写道 ... ...
两段代码,又不相似.没什么可对比的,如果第二段代码的method方法为以下 static void method(String[] a){//12 a = new String[]{"1","2"}; } 在这种情况下如果两段代码结果表现不一样,才有意思. 现在你两个例子里,一个是对传入的参数进行=操作,另一个是对传入的参数里的元素进行=操作.这又什么好对比的? 是呀,Java对象、简单类型的数组均是传址的,简单类型(含string)都是传值的。这个不难理解。用过C语言指针的理解起来无须费力。还画个图搞这么复杂干嘛呀? String跟普通引用类型完全一样。大大自己的理解就是错的还说别人么 |
|
返回顶楼 | |
发表时间:2011-06-28
haidii 写道 so easy
java的对象都是引用。 第一个只是把引用的地址改了,原来的字符串没变。 第二个是数组,数组是直接引用地址。 就这么简单。 正解. |
|
返回顶楼 | |
发表时间:2011-06-28
对象和值,对象是引用,值是赋值
|
|
返回顶楼 | |
发表时间:2011-06-28
如果你愿意欣赏汇编的话,你会发现,本来就应该是这样的
|
|
返回顶楼 | |
发表时间:2011-06-28
其实只要弄清楚
String ss = "abc"; 和 String sss = new String("abc") 的区别就很容易理解了 |
|
返回顶楼 | |
发表时间:2011-06-28
dotjar 写道
两段代码,结果的差异,请结合代码给图解下内存和执行过程。 public class PassAddr { public static void main(String[] args) { String s=new String("old"); //1 method(s); //3 System.out.println(s); } static void method(String str){ str=new String("new"); //2 } } 这个输出结果为:old public class T { public static void main(String[] args) { String[] arr=new String[2]; arr[0]="old_0"; arr[1]="old_1"; //11 method(arr); //14 System.out.println(arr[0]+";"+arr[1]); } static void method(String[] a){//12 a[0]="new_0"; a[1]="new_1"; //13 } }
这个输出却是:new_0;new_1 自己发的问题,想了半天想通了。解析下,希望各位斧正! string://1处时: //2处时: //3处: 由于方法调用已经完成,所以str临时变量在stack中消失,s还是0x001,其地址处对象new String("old")没有被动;所以输出结果还是old; ---------------------------------------------------固执的分割线------------------------------------------------------ //11处内存状态: //12处: //13处时候的内存状况: 此时a[0]和a[1]的值被改变,其实就是arr的相应值改变了。最后就出现了结果如图://14 所以就出现结果改变的情况了。 这么一作图,很直观了。 两个例子没有对比性,str在方法new了,而数组没有在方法内new |
|
返回顶楼 | |