图解直观java值传递的问题

  1. 1.1 字符串对象
  2. 1.2 数组对象
  • 2. 内存示意图
  • 两段代码,结果的差异,请结合代码给图解下内存和执行过程。

    1.1 字符串对象

    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

    1.2 数组对象

    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

    2. 内存示意图

    string

    • //1处时:
      image.png

    • //2处时:
      image.png

    • //3处:由于方法调用已经完成,所以str临时变量在stack中消失,s还是0x001,其地址处对象new String(“old”)没有被动;所以输出结果还是old;
      -—–固执的分割线———

    • //11处内存状态:
      image.png

    • //12处:
      image.png

    • //13处时候的内存状况:
      image.png
      此时a[0]和a[1]的值被改变,其实就是arr的相应值改变了。最后就出现了结果如图:

    • //14
      image.png
      所以就出现结果改变的情况了。

    这么一作图,很直观了。


    [2011-06-27]


    转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 hi@niewj.com

    ×

    喜欢就点赞,疼爱就打赏