任何人都可以告诉我这段代码:
public class OvTester {
@Override
public int hashCode() {
return toString().hashCode();
}
}
确定toString
类中的OvTester
方法会覆盖其超类中的toString
方法。
我想知道这是否属实,如果是,它是如何工作的?
如果不是这样,那就是这样:
“hashCode()
中的OvTester
方法必须覆盖其超类中的同名方法”
如果那不正确那么什么是正确的?
答案 0 :(得分:14)
当您在子级别中重新定义具有相同签名的方法时,会发生方法覆盖。
所以在这里,你要覆盖hashCode()
,而不是toString()
@Override
注释是可选的(但非常好)并且表明这应该是重写的。如果拼错了某些内容或者输入了错误的参数,编译器会发出警告。
所以是的,第二个陈述是真的(在这种情况下,超类是java.lang.Object
)
答案 1 :(得分:2)
我想知道这是否属实,如果是,它是如何工作的?
不,这不完全正确。
@Overrides
注释表示“此方法会覆盖超类中具有相同名称的”方法。
在这种情况下,hashCode
的{{1}}会覆盖OvTester
中的hashCode
。
如果不是这样,那么这是真的:
Object
中的hashCode()
方法必须覆盖其超类中的同名方法吗?
是。这正是它的工作原理。
当一个方法没有做任何事情而不是调用另一个方法(几乎是你在你的例子中得到的)时,它通常被称为delegate method。也许这就是你对此感到困惑的原因。
答案 2 :(得分:1)
@Override
注释不会“确定”任何内容。如果带注释的方法没有覆盖超类或接口方法,它只是一个告诉编译器引发错误的标志。它是开发人员帮助保持理智的工具,仅此而已。
在这种特定情况下,只是注意到hashCode()
中的OvTester
实现覆盖了hashCode()
中定义的Object
方法。这与toString()
没有任何关系,并且从toString()
方法调用超类的hashCode()
方法不会与覆盖toString()
不同。
这是真的吗? OvTester中的hashCode()方法必须覆盖相同的方法 在其superClass中的name方法?
确实如此,如果超类中没有与带注释方法的签名匹配的可覆盖hashCode()
方法,则注释将导致编译器引发错误。
答案 3 :(得分:0)
不,这只会意味着重写了hashCode()方法。编译器将在编译时检查hashCode()是否是一个被覆盖的方法(带有该签名)。
答案 4 :(得分:0)
@Override
只是编译时检查实施者是否真的覆盖了该方法。
如果您尝试覆盖
@Override
public void equals(Object ob){
}
将无法编译
答案 5 :(得分:0)
该代码会覆盖基本hashCode()
类的Object
方法。
toString()
方法仍然具有原始实现。
要覆盖toString()
,请执行以下操作:
@Override
public String toString() {
//Your own toString() implememntation here
}
只要子类中的方法与父类中的方法具有相同的名称和签名, AND 父类中的方法为 NOT private它将被覆盖(无论是否存在注释@Override
)