【Java】一文详解Java方法形参和实参

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;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_40915439/article/details/108537663