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

当我在java中创建一个对象时,jvm中到底发生了什么?,java,jvm,pass-by-reference,call-by-value,Java,Jvm,Pass By Reference,Call By Value,据我所知,如果我在写作 Car a3=new Car() 此语句将在jvm堆栈中创建一个名为a3的句柄,其所有属性都在jvm堆中。 如果这是正确的,我想知道调用值是如何工作的。 因此,如果我创建一个方法checkMethod(carc),并通过说checkMethod(a3)来调用它 假设我们的车是 public class Car{ int a=0; public int getpar(){ return a; } } 在checkMethod中,我尝试使

据我所知,如果我在写作

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

public class Car{
   int a=0;
   public int getpar(){
       return a;
   }
}
checkMethod
中,我尝试使用a3.a=5访问
因此我更改了
a3.a的值
它将在调用类中向我显示,并且它指向jvm在堆中创建的相同字段

但是当我做
a3=null时,然后在调用的方法中再次返回
checkMethod(a3)
并尝试查看此对象是否不为空?
为什么它的行为与作为???的对象的属性不同?

为什么它的行为与作为???的对象的属性不同?


因为Java是(纯)
按值调用的
。不能在被调用方上下文中操作参数的值。您总是在调用上下文中获取本地副本。

在方法调用中,Java传递引用的副本

因此,当将a3设置为null时,它只将引用的副本设置为null,并将存储在其他位置的其他副本设置为null

 checkMethod(a3);
传递一个值的副本,该值是对Car对象实例的引用

内部方法

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

将引用设置为null(复制)


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

整个技巧是:Java通过值传递引用(value:)

将a3(以及所有变量)想象成一张写有地址的纸。当您将一个变量传递给一个方法时,您将地址复制到一张新的纸上(BacuseJava是按值传递的)。当您将方法中的变量设置为null时,您会在一张纸上涂写地址。但是原来的还是汉克!这是有道理的。
a3 = null