`

@Marked-关于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处时:

//1处时候

//2处时:

//2处时候

//3处:

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

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

//11处内存状态:

//11处

//12处:

//12处

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

//13处

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

//14

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

这么一作图,很直观了。

分享到:
评论
10 楼 i.phoenix 2011-06-28  
JE帐号 写道
... ...
两段代码,又不相似.没什么可对比的,如果第二段代码的method方法为以下
static void method(String[] a){//12   
   a = new String[]{"1","2"};
} 

在这种情况下如果两段代码结果表现不一样,才有意思.
现在你两个例子里,一个是对传入的参数进行=操作,另一个是对传入的参数里的元素进行=操作.这又什么好对比的?

是呀,Java对象、简单类型的数组均是传址的,简单类型(含string)都是传值的。这个不难理解。用过C语言指针的理解起来无须费力。还画个图搞这么复杂干嘛呀?
9 楼 JE帐号 2011-06-28  
... ...
两段代码,又不相似.没什么可对比的,如果第二段代码的method方法为以下
static void method(String[] a){//12   
   a = new String[]{"1","2"};
} 

在这种情况下如果两段代码结果表现不一样,才有意思.
现在你两个例子里,一个是对传入的参数进行=操作,另一个是对传入的参数里的元素进行=操作.这又什么好对比的?
8 楼 yangguo 2011-06-28  
比较关心用什么画的图。
7 楼 fucktianya 2011-06-28  
haidii 写道
so easy
java的对象都是引用。
第一个只是把引用的地址改了,原来的字符串没变。
第二个是数组,数组是直接引用地址。
就这么简单。

我也这么认为!
6 楼 haidii 2011-06-28  
so easy
java的对象都是引用。
第一个只是把引用的地址改了,原来的字符串没变。
第二个是数组,数组是直接引用地址。
就这么简单。
5 楼 tom&jerry 2011-06-28  
第一个,相当于

s = new String("old");// s指向字符串old
str = s               //str指向字符串old
str = new String("new");//str指向字符串new

第二个,姑且让我这么写吧

arr = {"old_0","old_1"} //arr 指向数组{"old_0","old_1"}
a = arr                 //a指向数组{"old_0","old_1"}
a[0]="new_0";   //改变数组[0]位的值,变为{"new_0","old_1"}
a[1]="new_1";   //改变数组[1]位的值,{"new_0","new_1"}

描述并不太合适,比如声明变量没加类型,数组表示形式,参数应该压栈,数组内也是引用,。。不过大概就是这个意思。
4 楼 kingkan 2011-06-28  
分析得不错,赞一个。
3 楼 freish 2011-06-28  
这个应该去csdn发的,又要被投新手贴了
2 楼 walldr2161 2011-06-27  
素不素内存存储和引用、变量作用域问题?
1 楼 visionsky 2011-06-27  
相当不错,分析的很精辟,如果不看到这个,我已经我懂了,其实看来我对传值还没有搞得很明白

相关推荐

Global site tag (gtag.js) - Google Analytics