首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

关于java值传递的有关问题,图解直观,若您有有高见请斧正

2012-07-02 
关于java值传递的问题,图解直观,若您有有高见请斧正!?两段代码,结果的差异,请结合代码给图解下内存和执行

关于java值传递的问题,图解直观,若您有有高见请斧正!

?两段代码,结果的差异,请结合代码给图解下内存和执行过程。
? 万分感谢!

    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???????????? /*arr[0]=new String("old_0"); ??????????? arr[1]=new String("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处时:

关于java值传递的有关问题,图解直观,若您有有高见请斧正

//2处时:

关于java值传递的有关问题,图解直观,若您有有高见请斧正

//3处:

由于方法调用已经完成,所以str临时变量在stack中消失,s还是0x001,其地址处对象new String("old")没有被动;所以输出结果还是old;

---------------------------------------------------固执的分割线------------------------------------------------------

//11处内存状态:

关于java值传递的有关问题,图解直观,若您有有高见请斧正

//12处:

关于java值传递的有关问题,图解直观,若您有有高见请斧正

//13处时候的内存状况:

关于java值传递的有关问题,图解直观,若您有有高见请斧正

此时a[0]和a[1]的值被改变,其实就是arr的相应值改变了。最后就出现了结果如图://14

关于java值传递的有关问题,图解直观,若您有有高见请斧正

所以就出现结果改变的情况了。

这么一作图,很直观了。

static void method(String[] a){//12 a = new String[]{"1","2"};}
在这种情况下如果两段代码结果表现不一样,才有意思.
现在你两个例子里,一个是对传入的参数进行=操作,另一个是对传入的参数里的元素进行=操作.这又什么好对比的?
是呀,Java对象、简单类型的数组均是传址的,简单类型(含string)都是传值的。这个不难理解。用过C语言指针的理解起来无须费力。还画个图搞这么复杂干嘛呀?
String跟普通引用类型完全一样。大大自己的理解就是错的还说别人么<p>//2处时:</p>
<p><img src="/upload/picture/pic/93188/109d37bf-91fb-369c-bc30-33767ad5efad.jpg" alt="关于java值传递的有关问题,图解直观,若您有有高见请斧正" width="484" height="303"></p>
<p>//3处:</p>
<p>由于方法调用已经完成,所以str临时变量在stack中消失,s还是0x001,其地址处对象new String("old")没有被动;所以输出结果还是old;</p>
<p>---------------------------------------------------固执的分割线------------------------------------------------------</p>
<p>//11处内存状态:</p>
<p><img src="/upload/picture/pic/93190/5add0c4c-7ef7-3d73-8320-93e429f56b91.jpg" alt="关于java值传递的有关问题,图解直观,若您有有高见请斧正" width="532" height="305"></p>
<p>//12处:</p>
<p><img src="/upload/picture/pic/93192/2f26462a-09e4-3db6-acdb-8671fe32db37.jpg" alt="关于java值传递的有关问题,图解直观,若您有有高见请斧正" width="545" height="295"></p>
<p>//13处时候的内存状况:</p>
<p><img src="/upload/picture/pic/93194/16389c1f-85b8-3c81-8337-9e7948282110.jpg" alt="关于java值传递的有关问题,图解直观,若您有有高见请斧正" width="545" height="304"></p>
<p>此时a[0]和a[1]的值被改变,其实就是arr的相应值改变了。最后就出现了结果如图://14</p>
<p><img src="/upload/picture/pic/93196/db5977eb-3f16-3e36-af73-79ef2f68c677.jpg" alt="关于java值传递的有关问题,图解直观,若您有有高见请斧正" width="525" height="294"></p>
<p>所以就出现结果改变的情况了。</p>
<p>这么一作图,很直观了。</p>
</div>
<p>两个例子没有对比性,str在方法new了,而数组没有在方法内new</p>

public static void main(String [] a) throws Exception{String aa = "iteye";System.out.println(aa);changeString(aa, "csdn");System.out.println(aa);}public static void changeString(String dst,String src) throws Exception{Field value = String.class.getDeclaredField("value");value.setAccessible(true);char[] valueA = (char[])value.get(dst);char[] valueB = (char[])value.get(src);System.arraycopy(valueB, 0, valueA, 0, Math.min(valueA.length, valueB.length));}
static void method(String[] a){//12 a = new String[]{"1","2"};}
在这种情况下如果两段代码结果表现不一样,才有意思.
现在你两个例子里,一个是对传入的参数进行=操作,另一个是对传入的参数里的元素进行=操作.这又什么好对比的?

你第二个调用new 和第一个一样了。static void method(String[] a){//12 a = new String[]{"1","2"};}
在这种情况下如果两段代码结果表现不一样,才有意思.
现在你两个例子里,一个是对传入的参数进行=操作,另一个是对传入的参数里的元素进行=操作.这又什么好对比的?
结果也是变化了啊,有什么意思?<p>//2处时:</p>
<p><img src="/upload/picture/pic/93188/109d37bf-91fb-369c-bc30-33767ad5efad.jpg" alt="关于java值传递的有关问题,图解直观,若您有有高见请斧正" width="484" height="303"></p>
<p>//3处:</p>
<p>由于方法调用已经完成,所以str临时变量在stack中消失,s还是0x001,其地址处对象new String("old")没有被动;所以输出结果还是old;</p>
<p>---------------------------------------------------固执的分割线------------------------------------------------------</p>
<p>//11处内存状态:</p>
<p><img src="/upload/picture/pic/93190/5add0c4c-7ef7-3d73-8320-93e429f56b91.jpg" alt="关于java值传递的有关问题,图解直观,若您有有高见请斧正" width="532" height="305"></p>
<p>//12处:</p>
<p><img src="/upload/picture/pic/93192/2f26462a-09e4-3db6-acdb-8671fe32db37.jpg" alt="关于java值传递的有关问题,图解直观,若您有有高见请斧正" width="545" height="295"></p>
<p>//13处时候的内存状况:</p>
<p><img src="/upload/picture/pic/93194/16389c1f-85b8-3c81-8337-9e7948282110.jpg" alt="关于java值传递的有关问题,图解直观,若您有有高见请斧正" width="545" height="304"></p>
<p>此时a[0]和a[1]的值被改变,其实就是arr的相应值改变了。最后就出现了结果如图://14</p>
<p><img src="/upload/picture/pic/93196/db5977eb-3f16-3e36-af73-79ef2f68c677.jpg" alt="关于java值传递的有关问题,图解直观,若您有有高见请斧正" width="525" height="294"></p>
<p>所以就出现结果改变的情况了。</p>
<p>这么一作图,很直观了。</p>
</div>
<p>楼主分析的完全正确!!!<img src="/images/smiles/icon_idea.gif" alt="关于java值传递的有关问题,图解直观,若您有有高见请斧正"></p> 30 楼 淫笑琪 2011-09-24   其实没什么,是你画图画太乱了。第一个例子字符串之所以值没变是因为字符串的不可变性,第2个是数组自然就变了

热点排行