【发布时间】:2015-09-28 07:08:30
【问题描述】:
我编写了以下程序来测试 equals 和 Java 按值传递功能(根据文档 Java 是按值传递),所以当我将对象 a 传递给方法时,我实际上是在传递堆值。如果我在方法中更改对象的引用会怎样?会发生什么?
package equalstest;
public class EqualsMethodTest {
public static void main(String[] args) {
EqualsMethodTest a = new EqualsMethodTest();
EqualsMethodTest b = new EqualsMethodTest();
System.out.println(" Comparing a and B");
System.out.println(a == b);
System.out.println(a.equals(b));
EqualsMethodTest c = compare(a, b);
System.out.println(" Comparing B and C after interchanging references");
System.out.println(b == c);
System.out.println(b.equals(c));
System.out.println(" Comparing A and C after interchanging references");
System.out.println(a == c);
System.out.println(a.equals(c));
}
static EqualsMethodTest compare(EqualsMethodTest a, EqualsMethodTest b) {
EqualsMethodTest c = a;
a = b;
return c;
}
}
我得到以下输出:
比较a和B
更改前 a == b 错误
修改前 a.equals b false
交换引用后比较 B 和 C
修改后 b == c false
修改后 b.equals c false
交换引用后比较 A 和 C
修改后 a == c true
修改后 a.equals c true
- 在方法
compare中实际发生了什么? - 当我创建一个新引用
c时,它是否指向a的内存位置? - 当我将
b分配给a时会发生什么?
【问题讨论】:
-
是的,
c在调用 compare 方法后实际上与a具有相同的引用。当您将b分配给a时也没有发生任何事情,因为您是在本地范围compare中执行的,这不会影响您的主要方法中的原始引用。另外the common SO question for this topic answers this well multiple times -
您可能忽略了一个事实,即对象不是在 Java 中传递或分配,而是对它们的引用(指针)。
-
compare除了返回它的第一个参数外,什么都不做。