Java真的支持按引用传递吗?
如果不支持,为什么我们有“==”运算符来查找具有相同引用的两个对象?
Java真的支持按引用传递吗?
如果不支持,为什么我们有“==”运算符来查找具有相同引用的两个对象?
Java使用按值传递而不是按引用传递...
但是,对于非原始类型,值是引用的值。
因此,==比较对象的引用值。
// called
public void munge(List<String> a0, List<String> a1) {
List<String> foo = new List<String>(); foo.add("everybody");
a0.set(0, "Goodbye");
a1 = foo;
}
// caller
...
List<String> l0 = new List<String>(); l0.add("Hello");
List<String> l1 = new List<String>(); l1.add("world");
munge(l0, l1);
...
munge
返回后,调用者的第一个列表 l0
将包含 "Goodbye"
。对该列表的引用被传递给了 munge
,后者在该引用对象上调用了一个变异方法。(换句话说,a0
接收了 l0
值的副本,该值是指向字符串列表的引用,而该列表已经被修改。)munge
返回后,调用者的第二个列表 l1
仍然包含 "world"
,因为没有对传递的对象引用(即 l1
的值,通过值传递给 munge
)调用任何方法。相反,参数变量 a1
被设置为一个新值(也保存在 foo
中的局部对象引用)。
如果 Java 使用按引用传递,那么返回时,l1
将包含 "everybody"
,因为 a1
将引用 变量 l1
,而不仅仅是被初始化为其值的副本。因此,对 a1
的赋值也将是对 l1
的赋值。Java采用的是传值而不是传引用。原始值参数被复制到堆栈中,以及指向对象的指针。
应使用==
运算符比较原始值,并比较对象引用。
简短回答是不行的。在Java中只有值传递,当您使用对象(例如:Object obj = new Object();
)时,您正在使用对象引用。这些引用被按值传递。
详情请见:Java中的参数传递