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


答案 1

Java 总是按值传递参数,而不是按引用传递参数。在您的示例中,您仍在传递其值,而不是引用本身。在方法中,您将另一个(本地)引用 分配给将其作为参数传递的同一对象。修改该引用后,将修改作为参数传递的原始引用 。objchangeNameobjobj


编辑:

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

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-声明名为类型的引用,并将其分配给具有属性的新类型对象。fFooFoo"f"

Foo f = new Foo("f");

Enter image description here

2-从方法端,声明具有名称类型的引用,并将其最初分配给 。Fooanull

public static void changeReference(Foo a)

Enter image description here

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

changeReference(f);

Enter image description here

4-声明名为类型的引用,并将其分配给具有属性的新类型对象。bFooFoo"b"

Foo b = new Foo("b");

Enter image description here

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

Enter image description here


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

Enter image description here

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

Enter image description here

我希望您现在了解将对象作为参数传递在Java中的工作原理:)


答案 2

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

术语“通过引用传递”中的“引用”也不表示“对对象的引用”。它的意思是“对变量的引用” - 函数定义(或者更确切地说,调用框架)中可以存储值的命名“桶”。

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