Java 真的总是复制传递给方法的所有对象吗?

Does Java really always copy all objects passed to a method?

Java 是按值传递。这意味着被调用的方法作用于传入的对象的副本,而不是原始对象。

如果对象在方法中没有改变,创建一个实际的副本似乎是不必要的。因此,实现程序以创建此类副本的编译器效率非常低。所有 Java 编译器(javac、gcj、ECJ 等)真的都这样做了吗?

至少在声明参数的情况下final不复制很有意义。

编辑

好的,所以对象没有被复制。我很困惑,因为 String 的特殊之处在于它是复制的(不可变的)。对不起我的无知。为了弥补这一点,这里是传递对象时发生的事情的千分之一示例:

import java.lang.System;

class C { int member; }

public class Test {
    static void subMethod(C object) { object.member=1; }

    public static void main(String[] args) {
        C object = new C();
        object.member=0;
        subMethod(object);
        System.out.println(object.member);  // prints "1"
    }
}

Java中的对象是引用,传值的就是这个引用;意思是 Java 是 pass-by-reference 与实际目的的对象。

编辑

看来我对'practical purposes'这个词的使用引起了很多争议,所以让我澄清一下。我的意思只是说,当大多数人想到 'pass-by-reference' 时,他们想到的是对传入值的更改在该方法之外持久化,Java 就是这种情况。例如

void someMethod(SomeClass a) {
    a.mutateState();
}
SomeClass a = new SomeClass();
someMethod(a); //passes reference to a by value; 
a.methodInvolvingSomeState(); //mutations of object state persist to here, as if the previous call were pass-by-reference.

这就是我'for practical purposes'的意思; OP 的印象是制作了 a 的副本,我试图解释这不是真的。我完全知道 java 总是 pass-by-value,因此明确声明它是按值传递的引用。正如评论中所指出的那样,在很多情况下它与 实际上 pass-by-reference 并不相同,我无意表明任何其中有可能 Java.

是的,Java 总是 pass-by-value。但是对于对象,它传递的是引用值。换句话说,对象没有被复制,但它的引用被复制了。在方法内部更改对象的属性也会在方法外部更改它。

来自 here

However, Objects are not passed by reference. A correct statement would be Object references are passed by value.

On-topic: 编译器简单地将引用复制到堆栈中的内存块。