2014-07-02 53 views
2

据我了解,如果我写当我在java中创建对象时,jvm究竟发生了什么?

Car a3=new Car() 

该语句将创建一个与它在JVM堆中的所有属性JVM堆命名a3手柄。 如果这是正确的,我想知道价值如何调用。 所以,如果我创建一个方法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)并试图看到这个对象它不是null? 为什么它的表现与对象属性相比是不同的?

+1

想象A3(和所有变量)为与对他们写的地址的纸片。当你将一个变量传递给一个方法时,你将**地址**复制到一张新纸上(bacuse java是按值传递的)。当您将该方法内的变量设置为空时,您可以在纸上写出地址。但原来的遗迹 –

+0

谢谢!这是有道理的。 – piyush

回答

1
checkMethod(a3); 

传递一个值是反对汽车的实例

里面方法...

a3.a = 5 

使用A3参考的复制,修改这是由识别汽车的对象实例a3(这是原始a3的副本)。

a3 = null 

设置基准为null(复印件)

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

1

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

由于Java是(纯)call by value。您无法操作被调用上下文中的参数值。您始终在调用上下文中获取本地副本。

0

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

所以当将a3设置为null时,它只会将其引用的副本设置为null,并将其他副本存储在其他位置。

0

整个诀窍是这样的:Java的传递引用通过 :)

相关问题