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: 编译器简单地将引用复制到堆栈中的内存块。
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: 编译器简单地将引用复制到堆栈中的内存块。