Java是否真的按值传递对象?

可能重复:是否通过引用传递Java?

public class myClass{
    public static void main(String[] args){
        myObject obj = new myObject("myName");
        changeName(obj);
        System.out.print(obj.getName()); // This prints "anotherName"
    }
    public static void changeName(myObject obj){
        obj.setName("anotherName");
    }
}

我知道Java按值传递,但为什么它在前面的示例中通过引用传递obj并进行更改?


Java总是通过值传递参数,而不是通过引用。 在你的例子中,你仍然通过它的值传递obj ,而不是参考本身。 在您的方法changeName ,您将另一个(本地)引用obj分配给您将其作为参数传递给它的同一对象。 一旦您修改了该引用,即修改了作为参数传递的原始引用obj


编辑:

让我通过一个例子来解释这一点:

public class Main
{
     public static void main(String[] args)
     {
          Foo f = new Foo("f");
          changeReference(f); // It won't change the reference!
          modifyReference(f); // It will change the object that the reference refers to!
     }
     public static void changeReference(Foo a)
     {
          Foo b = new Foo("b");
          a = b;
     }
     public static void modifyReference(Foo c)
     {
          c.setAttribute("c");
     }
}

我将逐步解释这一点:

1-声明一个名为fFoo类型的引用,并将其赋值给一个具有属性"f" Foo类型的新对象。

Foo f = new Foo("f");

2-在方法方面,声明一个名为a的类型为Foo的引用,并且它最初分配给null

public static void changeReference(Foo a)

3-当您调用changeReference方法changeReference ,引用a将被分配给作为参数传递的对象。

changeReference(f);

4-声明一个名为bFoo类型的引用,并将其赋值给一个具有属性"b" Foo类型的新对象。

Foo b = new Foo("b");

5 a = b将引用a NOT f重新分配给其属性为"b"的对象。


6-当您调用modifyReference(Foo c)方法时,会创建一个引用c并将其分配给属性为"f"的对象。

7- c.setAttribute("c"); 将改变引用c点的对象的属性,并且引用f指向它的是同一个对象。

我希望你现在能理解如何将对象作为参数传递给Java。


在Java中,对象句柄或对象的标识被认为是一个值。 按值传递意味着传递该句柄,而不是该对象的完整副本。

术语“通过参考”中的“参考”也并不意味着“参考对象”。 它的意思是“引用一个变量” - 一个名为“桶”的函数定义(或者说,一个调用框架)可以存储一个值。

通过引用传递意味着被调用的方法可以更改调用方法中的变量值。 (例如,在C标准库中,函数scanf这种方式工作。)这在Java中不可行。 您始终可以更改对象的属性 - 它们不被视为其“值”的一部分。 它们是完全不同的独立对象。


你正在改变obj的属性,而不是改变obj (参数)本身。

重点是,如果你指出objchangeName中的其他地方,那个改变将不会反映在main

看到这个职位进一步澄清。

链接地址: http://www.djcxy.com/p/3501.html

上一篇: Is Java really passing objects by value?

下一篇: reference, right?...right?