与等式方法相关的 Java 代码

2022-08-31 13:20:39

我正在练习考试,发现了一个我不明白的样题。

对于以下代码,请查找输出内容:

public class Test {

    private static int count = 0;

    public boolean equals(Test testje) {
        System.out.println("count = " + count);
        return false;
    }

    public static void main(String [] args) {
        Object t1 = new Test();
        Object t2 = new Test();
        Test t3 = new Test();
        Object o1 = new Object();

        ++count; t1.equals(t2);
        ++count; t1.equals(t3);
        ++count; t3.equals(o1);
        ++count; t3.equals(t3);
        ++count; t3.equals(t2);
    }
}

这段代码的输出是,但我不明白为什么。任何人都可以帮我吗?count = 4


答案 1

你应该注意的第一件事是 它不会覆盖 的 ,因为参数是 代替 ,所以签名不匹配。public boolean equals(Test testje)ObjectequalsTestObject

因此,该方法在执行时只调用一次,因为这是执行实例的静态类型并且参数的类型都是类的唯一情况。mainequals(Test testje)t3.equals(t3);equalsTest

t3.equals(t3);是第 4 个语句(在静态变量的 4 个增量之后),因此打印 4。equalscount

所有其他语句都执行 的 ,因此不打印任何内容。equalsObjectequals

更详细的解释:

t1.equals()调用 s 而不考虑参数的类型,因为 静态(编译时)类型 is 是 ,并且类不会重写该方法。该类没有具有单个参数的方法,因此无论 的动态(运行时类型)如何,都无法调用。Objectequalst1ObjectTestObjectequalsTestequals(Test testje)t1

t3.equals()可以执行 的或 等于,因为 编译时类型 is 是 ,并且该类有两个方法(一个继承自类,另一个在类中定义)。ObjectequalsTestt3TestTestequalsObjectTest

选择的方法取决于参数的编译时类型:1.当参数为(如 or )时,将调用 's 并且不打印任何内容。2. 当参数为 时,如 中 所示,两个版本都与该参数匹配,但由于方法重载的规则,选择具有最具体参数 - - 的方法并打印变量。Objectt3.equals(o1);t3.equals(t2);ObjectequalsTestt3.equals(t3);equalsequals(Test testje)count


答案 2

Test 中的 equals 方法采用 Test 的实例。

之前的所有尝试都是使用 Object 的实例进行的,该实例从 Object 类中获取了固有的方法:

public boolean equals(Object o){
  return this == o;
}

由于那里没有打印,因此它不会打印任何值。

您的意志会递增计数值,所以当您实际调用您的值时++count;

public boolean equals(Test testje){...

方法,即打印该值,计数的值为 4。


推荐