让我们考虑以下代码:

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 类的静态字段,并且该字段也在该类 t1t2 的两个实例之间共享。然后我测试它们是否引用了内存中的相同值,并且确实如此,结果为真。这对我来说很清楚。

但是,如果我从 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);

我希望 t1t2 这两个实例的字段值都为 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 比较这两个引用。

10-07 14:25
查看更多