2

据我了解,如果我在写

Car a3=new Car() 

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

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

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

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

4

4 回答 4

1

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

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

于 2014-07-02T08:44:53.660 回答
1
 checkMethod(a3);

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

内部方法...

a3.a = 5

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

a3 = null

将引用设置为 null ( 复制)

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

于 2014-07-02T08:54:22.637 回答
0

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

因此,当将 a3 设置为 null 时,它仅将其引用的副本设置为 null 以及存储在其他位置的其他副本。

于 2014-07-02T08:47:09.573 回答
0

整个技巧是这样的:Java按值传递引用:)

于 2014-07-02T08:55:07.470 回答