1. 简介
对于形参和实参,我们已经不再陌生,看下面这段代码
public static void main(String[] args) { StringBuffer buffer1 = new StringBuffer("A"); StringBuffer buffer2 = new StringBuffer("B"); test(buffer1, buffer2); System.out.println(buffer1 + " " + buffer2); } public static void test(StringBuffer buffer1, StringBuffer buffer2) { buffer1.append(buffer2); buffer2 = buffer1; }
第一层的人:压根看不懂
第一层的人:在buffer2该不该变成AB徘徊
第三层的人:知道Java是值传递,直接赋值是没有效果的
第四层的人:直接从JVM来考虑这个问题,清晰简明
2. 分析
题主在之前的时候,也是硬背一些公式,比如说:String 为形参肯定是不改变的,一直没有去认真的理解到JVM的那个程度
今天我们从JVM的角度来讲一讲这个方法的引用
首先,对于
StringBuffer buffer1 = new StringBuffer("A"); StringBuffer buffer2 = new StringBuffer("B");`
在栈堆中发生的变化
为main方法创建了一个栈帧,在栈帧中存储着buffer1和buffer2变量
下面这行代码,在虚拟机发生的过程:
test(buffer1, buffer2); public static void test(StringBuffer buffer1, StringBuffer buffer2) { buffer1.append(buffer2); buffer2 = buffer1; }
为test方法创建了一个栈帧,创建了2个参数,buffer1和buffer2,最终的指向情况如上图所示
3. 问题
public class lll { public static void main(String[] args) { StringBuffer buffer1 = new StringBuffer("A"); StringBuffer buffer2 = new StringBuffer("B"); test(buffer1, buffer2); System.out.println(buffer1 + " " + buffer2); } public static void test(StringBuffer buffer1, StringBuffer buffer2) { buffer1.append(buffer2); buffer2 = buffer1; buffer2.append("C"); buffer1 = buffer2; } }