如何在不执行超类方法的情况下获取其 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()
方法(仍然在super
class)像
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
。
这是我的超类 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()
方法(仍然在super
class)像
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
。