@override注释

时间:2011-08-23 11:43:11

标签: java annotations

任何人都可以告诉我这段代码:

public class OvTester {
    @Override
    public int hashCode() {
        return toString().hashCode();
    }
}

确定toString类中的OvTester方法会覆盖其超类中的toString方法。

我想知道这是否属实,如果是,它是如何工作的?

如果不是这样,那就是这样:

hashCode()中的OvTester方法必须覆盖其超类中的同名方法”

如果那不正确那么什么是正确的?

6 个答案:

答案 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