JVM_Java到底是值传递还是引用传递

2021-04-22 18:28

阅读:466

标签:code   str   粘贴   字节码   strong   完成   ima   两种   info   

这个问题的完整语义是:

Java方法调用时,参数变量是值传递还是引用传递的。

所谓引用传递是指传递栈帧中的局部变量表的变量槽地址,值传递是指传递栈帧中的局部变量表的变量槽地址所存储的值。

局部变量表中的变量槽分为两种:

基本类型变量槽会直接存储字面量值,引用类型变量槽会存储堆中的对象地址。

回答这个问题,最有说服力的角度还是从jvm来解释,来看下面这个Java代码及反编译的字节码指令:

public class TestArg {
    public void a() {
        int a = 10;
        b(a);
    }

    public int b(int i) {
        return i + 100;
    }
}

技术图片

下面对指令进行解释:

aload_0 表示将第一个局部变量this压入操作数栈;

iload_1 表示将第二个局部变量(int型的)压入操作数栈;

invokevirtual 表示调用b方法;

我们可以得出这样的结论,a方法调用b方法并传递参数时流程如下:

  1. a方法将局部变量了表中的变量取出,压入操作数栈
  2. 为新方法创建一个新的栈帧,入虚拟机栈,将新的栈帧设置为当前栈。
  3. 将参数从调用者方法a的栈帧中的操作数栈中出栈,然后写入被调用方法b的局部变量表中。
  4. 根据b方法中的bytecode,执行b方法中的指令

从以上流程可以总结出:

a调用b方法并传递参数,并不会改变a方法的局部变量表。

方法调用是通过操作数栈完成两个栈帧的局部变量表中变量的传递,相当于是将变量槽中的值复制了一份,通过操作数栈粘贴给了被调用方法的参数变量。这也正是值传递的定义。
所以Java是值传递。

参考:https://www.eefocus.com/embedded/279883
https://zhouj000.github.io/2019/03/21/java-base-jvm5/

JVM_Java到底是值传递还是引用传递

标签:code   str   粘贴   字节码   strong   完成   ima   两种   info   

原文地址:https://www.cnblogs.com/hans-kl/p/13275365.html


评论


亲,登录后才可以留言!