java - JVM 如何处理引用变量?

标签 java reference jvm

只是想知道这个说法是否属实:

对于这些代码行:

Person Bob = new Person("Bob W.", 30);
System.out.println(Bob.name);

创建一个对象 Person 并将其内存地址或一种引用发送给 Bob,即引用变量。接下来,当我们调用“Bob.name”时,JVM会查看Bob持有的“地址”,并去那里查看Person对象。然后 JVM 查看 Bob 的名字并打印它!

谢谢!

最佳答案

Java 中的所有对象都是通过其引用来访问的(与原始访问不同!)。变量 bob 是对 Person 类实例的引用。实例的内存分配/处置将由 JVM 处理,并且只要存在对该实例的强引用(即 Person bob = new ... ),实例数据就会由 JVM 保持 Activity 状态声明对新创建的 Person 实例的强引用)。

An Object Person is created and its memory address or a kind of reference is sent to Bob, the reference variable

更正确的说法是“创建了 Person 对象的实例”,但是,是的,Java 中用于对象的所有变量都是引用变量。调用new将返回对所创建实例的引用。可以有许多指向单个实例的引用变量。例如,在下面的代码片段中,我们可以有两个引用指向单个实例:

Person bob = new Person("Bob W.", 30);
Person bob2 = bob;

Next, when we call "Bob.name", the JVM looks at the "address" held by Bob and goes there to look at the Person Object.

正是如此。代码编译后,JVM字节码将使用指令getfield来访问name字段。该指令需要对象引用和字段引用。在这种情况下,bob.name 将使用 bob 作为 objectref 并使用 Person#name 作为 字段引用

关于java - JVM 如何处理引用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53137482/

相关文章:

java - 对于一个类中的多个操作,哪个更好? actionPerformed() 中的匿名内部类或 if 语句?

php - 将 create_function 用作闭包时从包含作用域引用变量。 PHP

c# - 冗余 "using"是否会降低性能

java - Apache Spark - 内存异常错误 - IntelliJ 设置

java - 在 Kotlin 中声明常量的所有方式之间的性能差异是什么?

java - 如何找到哪个Finalizer耗时

java - 如何在java中获取否定响应代码

java - 在 Java 8 中使用stream()和map()返回 double 组

java - 在 Java 中为 .split 使用多个定界符

.net - 构建错误——缺少引用