关于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

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

这么一作图,很直观了。

猜你喜欢

转载自niewj.iteye.com/blog/1105732