如何在不执行超类方法的情况下获取其 return 值?

How can I get the return value of a superclass method without executing it?

这是我的超类 equals() 方法:

public boolean equals(Object other){
    Car c = (Car)other;
    if(this.make.equals(c.make) && this.model.equals(c.model)){

        System.out.println("True, Cars are equal");
        return true;
    }

    else 
        System.out.println("False, Cars are not equal");
    return false;

}

这是我的子类 equals() 方法:

public boolean equals(Object other) {
    GreenCar g = (GreenCar) other;
    if(super.equals(g)==true){

        if (this.type.equals(g.type)) {
            System.out.println("True, Cars are equal");
            return true;
        } else {
            System.out.println("False, Cars are not equal");

            return false;
        }
    }
    else
        System.out.println("False, Cars are not equal");
    return false;
}

当它在 if(super.equals(g)==true){ 处运行检查时,它会执行该方法并打印出 true 或 false。我怎样才能检查 return 值?

您不能 运行 不打印任何内容的方法。

这就是为什么您的大多数方法不应该 "side effects"(比如将内容打印到屏幕上)。

从两个 equals 方法中删除 println 调用。将它们添加到调用 equals 的代码中。

就像人们说的那样,如果你希望它在你调用它时不打印某些东西,你需要去掉那些 println,因为每次你调用该方法时它都会打印。

请注意,您可以通过删除这些 else 来缩短一些方法,因为如果条件为真,它会在到达下一个代码体之前返回。例如

public boolean equals(Object other){
    Car c = (Car)other;
    if(this.make.equals(c.make) && this.model.equals(c.model))//if this is true
        return true;//the method ends here
    return false;//if the method hasn't ended yet then the conditional must be false
 }

我还注意到您使用了 if(super.equals(g)==true) 但如果您只输入 if(super.equals(g)) 它具有相同的效果,因为您输入了一个布尔值并检查布尔值是否为真。如果你想有 if((boolean)==false) 的效果,你可以做 if(!(boolean)) 因为它检查那个布尔值的反面是否为真。

在你的 super class 中,你可以这样写

protected boolean equals(Object other, boolean debug) {
    if (other instanceof Car) {
        Car c = (Car) other;
        if (this.make.equals(c.make) && this.model.equals(c.model)) {
            if (debug) {
                System.out.println("True, Cars are equal");
            }
            return true;
        }
    }
    if (debug) {
        System.out.println("False, Cars are not equal");
    }
    return false;
}

然后你可以修改你的equals()方法(仍然在superclass)像

public boolean equals(Object other) {
    return equals(other, true); // <-- default to debug.
}

接下来您的 subclass 应该调用带有 debug 标志的版本,例如

if (super.equals(g, false)) { // you don't need == true

或者,您可以使用 Logger 并根据需要启用和禁用 debug