让我们考虑以下代码:
public class Testing {
static int i = 47;
public static void main(String[] args) {
Testing t1 = new Testing();
Testing t2 = new Testing();
System.out.println(t1.i == t2.i);
我正在创建一个属于 Testing 类的静态字段,并且该字段也在该类
t1
和 t2
的两个实例之间共享。然后我测试它们是否引用了内存中的相同值,并且确实如此,结果为真。这对我来说很清楚。但是,如果我从
int i
的声明中删除 static 关键字,则会发生意外。public class Testing {
int i = 47;
public static void main(String[] args) {
Testing t1 = new Testing();
Testing t2 = new Testing();
System.out.println(t1.i == t2.i);
我希望
t1
和 t2
这两个实例的字段值都为 47,但它们的字段位于不同的内存地址中。但令人惊讶的是,在测试 t1.i == t2.i
时,在这种情况下我也得到了正确的结果 - 为什么?字段 int i = 47;
不再是静态的,所以我希望它对于类的每个实例都在不同的内存地址中,但相等性为真。 最佳答案
int
是原始类型,而不是引用类型。条件 t1.i == t2.i
不测试引用相等性——这里首先没有引用。它只是比较值,在这种情况下,两者都具有 47
值。
如果您有一个不是基元的成员字段,结果会有所不同,例如:
public class Testing {
Integer i = new Integer(47);
public static void main(String[] args) {
Testing t1 = new Testing();
Testing t2 = new Testing();
System.out.println(t1.i == t2.i); // false
}
}
在这种情况下,每个实例对使用调用构造函数的
Integer
关键字创建的 new
对象都有不同的引用,并且条件 t1.i == t2.i
比较这两个引用。