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

2018-12-12  本文已影响0人  lhsjohn

这是我看到的一道题

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

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

上一篇 下一篇

猜你喜欢

热点阅读