日期:2014-05-20  浏览次数:20879 次

方法调用完后,内存中的堆栈是怎么变化的呀?(例子)

下面这个例子输出结果为:
AB@AB
AB
B


我想问下,在test方法中,s2=s1,此时s2他s1的值是相等的。s1.append(s2),s1的值变了,但是s1引用没变。等test方法结束后,内存中的堆栈是怎么变化的?谢谢了?


package com.expert58.practice;

public class PracticeDemo2 {

public static void main(String[] args) {

StringBuilder s1 = new StringBuilder("A");

StringBuilder s2 = new StringBuilder("B");

test(s1, s2);

System.out.println(s1);
System.out.println(s2);

//System.out.print(s1 + "~" + s2);

}

private static void test(StringBuilder s1, StringBuilder s2) {

s1.append(s2);

s2 = s1;

System.out.println(s1 + "@" + s2);

}

}



------解决方案--------------------
package com.expert58.practice;

public class PracticeDemo2 {

public static void main(String[] args) {

StringBuilder s1 = new StringBuilder("A");

StringBuilder s2 = new StringBuilder("B");

test(s1, s2);

System.out.println(s1);
System.out.println(s2); 

//System.out.print(s1 + "~" + s2);

}

private static void test(StringBuilder s1, StringBuilder s2) {

s1.append(s2); //这里的s1不是main的s1,只是指向了和main的s1指向相同的对象

s2 = s1; //这里的s2也不是main的s2,所以这里是改变test方法的s2的指向,不影响main的s2指向

System.out.println(s1 + "@" + s2);

}

}

就打个比方,我和你一起浏览这个页面,你的回复我能看到,我的回复你也能看到,因为我们浏览的是相同的页面,但不等于你就是我,而此时,如果你链接到别的页面去了,也就相当于test里的s2 = s1; test的s2链接到别处了,但main的s2没有动,此时你觉得我看到的页面会跟你一样吗?