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

╰+哭是因爲堅強的太久メ 2022-12-06 01:20 221阅读 0赞

1. 简介

对于形参和实参,我们已经不再陌生,看下面这段代码

  1. public static void main(String[] args) {
  2. StringBuffer buffer1 = new StringBuffer("A");
  3. StringBuffer buffer2 = new StringBuffer("B");
  4. test(buffer1, buffer2);
  5. System.out.println(buffer1 + " " + buffer2);
  6. }
  7. public static void test(StringBuffer buffer1, StringBuffer buffer2) {
  8. buffer1.append(buffer2);
  9. buffer2 = buffer1;
  10. }

第一层的人:压根看不懂

第一层的人:在buffer2该不该变成AB徘徊

第三层的人:知道Java是值传递,直接赋值是没有效果的

第四层的人:直接从JVM来考虑这个问题,清晰简明

2. 分析

题主在之前的时候,也是硬背一些公式,比如说:String 为形参肯定是不改变的,一直没有去认真的理解到JVM的那个程度

今天我们从JVM的角度来讲一讲这个方法的引用

首先,对于

  1. StringBuffer buffer1 = new StringBuffer("A");
  2. StringBuffer buffer2 = new StringBuffer("B");`

在栈堆中发生的变化

在这里插入图片描述
为main方法创建了一个栈帧,在栈帧中存储着buffer1和buffer2变量

下面这行代码,在虚拟机发生的过程:

  1. test(buffer1, buffer2);
  2. public static void test(StringBuffer buffer1, StringBuffer buffer2) {
  3. buffer1.append(buffer2);
  4. buffer2 = buffer1;
  5. }

在这里插入图片描述

为test方法创建了一个栈帧,创建了2个参数,buffer1和buffer2,最终的指向情况如上图所示

3. 问题

  1. public class lll {
  2. public static void main(String[] args) {
  3. StringBuffer buffer1 = new StringBuffer("A");
  4. StringBuffer buffer2 = new StringBuffer("B");
  5. test(buffer1, buffer2);
  6. System.out.println(buffer1 + " " + buffer2);
  7. }
  8. public static void test(StringBuffer buffer1, StringBuffer buffer2) {
  9. buffer1.append(buffer2);
  10. buffer2 = buffer1;
  11. buffer2.append("C");
  12. buffer1 = buffer2;
  13. }
  14. }

发表评论

表情:
评论列表 (有 0 条评论,221人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java方法参数的

    在之前的文章中,小千给大家讲解了方法的定义、调用和返回值,但方法的内容还有很多,比如方法的参数是怎么回事?接下来会在这篇文章中,继续给大家讲解方法参数相关的知识,这就是我们今天

    相关 java调用释疑

    总结 1.方法形参 调用方法时,将实参变量值复制一份,传递给形参变量,实参引用类型的时候,是将引用类型的地址值传递给形参变量,指向堆内存中的地址,通过该地址可以修改

    相关 Java变量,

    成员变量 成员变量定义在类中,在整个类中都可以被访问。 成员变量分为类成员变量和实例成员变量,实例变量存在于对象所在的堆内存中,类成员变量也叫静态变量,存在于静态域内

    相关 方法

    java方法的参数传递机制:值传递 所谓值传递,就是讲实际参数值的副本传入方法内,而参数本身不会受到任何影响。 \[java\]  [view plain][]  

    相关

    形参(argument) 全称:"形式参数" 目的:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。 作用:实现主调函数与被调函数之间的联系