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

时间:2014-07-02 08:40:19

标签: 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)并尝试查看此对象不为空? 为什么它与对象的属性相比表现不同?

4 个答案:

答案 0 :(得分:1)

Why it behaved differently as compared to property of object that is a?

因为Java是(纯)call by value。您无法在被调用者上下文中操纵参数的值。您总是在调用上下文中获取本地副本。

答案 1 :(得分:1)

 checkMethod(a3);

传递一个值的副本,该值是对Car

的对象实例的引用

内部方法......

a3.a = 5

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

a3 = null

将引用设置为null(复制)

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

答案 2 :(得分:0)

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

因此,当将a3设置为null时,它只将其引用的副本设置为null,而将其他副本设置为其他位置。

答案 3 :(得分:0)

完整的诀窍是:Java通过传递引用:)