java - 当我在java中创建一个对象时,jvm中到底发生了什么?

标签 java jvm pass-by-reference call-by-value

据我所知,如果我正在写

Car a3=new Car() 

该语句将在 jvm 堆栈中创建一个名为 a3 的句柄,其所有属性都在 JVM 堆中。 如果这是正确的,我想知道按值调用是如何工作的。 因此,如果我创建一个方法 checkMethod(Car c) 并通过说 checkMethod(a3); 调用它 假设我们的车是

public class Car{
   int a=0;
   public int getpar(){
       return a;
   }
}

checkMethod中,我尝试访问using a3.a = 5;,所以我更改了a3.a的值 它将在调用类中向我显示,并且它指向 jvm 在堆中创建的相同字段。

但是当我在调用方法中执行 a3= null; 并再次返回我调用的方法时 checkMethod(a3) 并尝试查看该对象是否为空? 为什么它的行为与 a 对象的属性相比不同???

最佳答案

 checkMethod(a3);

传递一个值的副本,该值是对 Car 对象实例的引用

内部方法...

a3.a = 5

使用a3,修改由a3标识的Car的对象实例(它是原始a3的副本)。

a3 = null

将引用设置为 null(复制)

发生这种情况时,只有传递给方法的副本才会指向 null。但原来的 a3 仍然指向你的 Car 对象实例。

关于java - 当我在java中创建一个对象时,jvm中到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24526583/

相关文章:

java - SVM 响应 opencv 中的问题

java - 在生产中执行java ee应用程序的详细日志

php - 最好不要将 &$ 与大字符串一起使用以节省内存吗?

java - 使用 Java 移动和重命名文件

java - log4j2领域的级别扩展

java - 如何在 Scala 中向现有 Java 类添加工厂方法

javascript - JS通过引用推送对象的原因是什么?

java - 运行时 gc 实际上做了什么以及导致此输出的原因是什么?

Ubuntu 中的 Java OutofMemory 错误,即使有足够的可用内存

c++ - 为什么我们将对象的引用作为参数传递给重载输出运算符