【发布时间】:2016-01-11 14:52:10
【问题描述】:
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 仅是按值传递的?仅适用于原始类型的 AFAIK。
-
@HubertGrzeskowiak Java 总是按值传递。在非原始类型的情况下,它通过值传递引用。
-
如果我们不是在谈论原始数据类型,即对象,JAVA 是通过引用传递的。我不知道你从哪里得到 JAVA 是按值传递的想法......
-
@TT。如果 Java 将在任何时候通过引用传递,那么您可以执行
a = new A()其中a是类A的参数,并且这个新引用也会在传递给方法的原始变量中发生变化,因此它's 唯一的按值传递... -
@Kevin Goodness,什么吹毛求疵。 JAVA 通过值传递对 ... 周围对象的引用。当然,它不会通过引用传递引用,这不是用任何语言完成的。也没有 C++ 中的引用类型。真的,这不是 OP 的重点。他认为对象是按值传递的,但事实并非如此(否则该对象将像在 C++ 中一样被复制)。对象通过引用传递。把它放在不同的地方只会造成混乱。只有我 2c。
标签: java compiler-optimization pass-by-value