java - JVM如何处理引用变量?
问题描述
只想知道这个说法是否正确:
对于这些代码行:
Person Bob = new Person("Bob W.", 30);
System.out.println(Bob.name);
创建一个 Object Person 并将其内存地址或一种引用发送给 Bob,即引用变量。接下来,当我们调用“Bob.name”时,JVM 会查看 Bob 持有的“地址”,然后去那里查看 Person 对象。然后 JVM 查看 Bob 的名字并打印出来!
谢谢!
解决方案
Java 中的所有对象都通过它们的引用进行访问(不同于原始访问!)。该变量bob
是对Person
类实例的引用。实例的内存分配/处置将由 JVM 处理,只要存在对该实例Person bob = new ...
的强引用(即声明对新创建的Person
实例的强引用),JVM 就会使实例数据保持活动状态。
创建一个 Object Person 并将其内存地址或一种引用发送给 Bob,即引用变量
说“创建了 Person 对象的实例”会更正确,但是是的,Java 中用于对象的所有变量都是引用变量。调用new
将返回对创建的实例的引用。可以有许多指向单个实例的引用变量。例如,在下面的代码片段中,我们可以有两个指向单个实例的引用:
Person bob = new Person("Bob W.", 30);
Person bob2 = bob;
接下来,当我们调用“Bob.name”时,JVM 会查看 Bob 持有的“地址”,然后去那里查看 Person 对象。
确切地。编译代码后,JVM 字节码将使用该指令getfield
访问该name
字段。该指令需要对象引用和字段引用。在这种情况下bob.name
,将bob
用作objectref
并Person#name
用作fieldref
。
推荐阅读
- c# - 以编程方式检测与 Quamotion WebDriver 一起使用的应用程序
- python - Python:如何使用 .format() 将不同长度的列表解压缩为字符串
- c# - 如果检查两者都有值并且两者相等,则简化
- html - 如何使用formio在表单管理器的一种布局中设置提交表单
- java - SVG 无法找到我在自动化脚本中验证所需的图形元素的 xpath
- azure-sql-database - 何时在 Azure SQL DB 上禁用 TDE
- excel - 更改 Excel 中数字的格式
- scikit-learn - sklearn 中的精度、召回率和混淆矩阵问题
- jquery - 使用 jquery 和 ajax 动态更改文本颜色,具有不同的颜色、不同的文本和具有相同的属性/类
- java - 如何将 SQL(嵌套子查询)转换为 QueryBuilder 创建的查询