一道题目来分析Java中的值传递和引用的传递

这是我看到的一道题

private static void change(StringBuffer str11, StringBuffer str12) {

    str12 = str11;
    str11 = new StringBuffer("new world");
    str12.append("new world");
}

public static void main(String[] args) {
    StringBuffer str1 = new StringBuffer("good ");
    StringBuffer str2 = new StringBuffer("bad ");
    change(str1, str2);
    System.out.println(str1.toString());
    System.out.println(str2.toString());
}

结果是什么呢?

先给出这道题目的答案

**good new world

bad**

下面画图来分析这个过程

private static void change(StringBuffer str11, StringBuffer str12) {

    str12 = str11;//2
    str11 = new StringBuffer("new world");//3
    str12.append("new world");//4
}//5

public static void main(String[] args) {
    StringBuffer str1 = new StringBuffer("good ");
    StringBuffer str2 = new StringBuffer("bad ");
    change(str1, str2);//1
    System.out.println(str1.toString());
    System.out.println(str2.toString());
}

执行到第一步的图:

2018-10-24-1.png

执行到第二步的图,这里chage方法中的形参str11,str22是实参str1,str2的地址拷贝。

2018-10-24-2.png

这里str11和str22是实参str1,str2的地址拷贝,接着执行第三步的图:

2018-10-24-3.png

上图中str12地址指向了“good”,接着看第四步图:

2018-10-24-4.png

上图中str11的地址指向了堆中新的对象"new world",接着看第五步的图:

2018-10-24-5.png

收藏自 一枝花算不算浪漫的博客

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容