2011-08-23 127 views
9

谁能告诉我,如果这个代码:@Override注释

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

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

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

如果这不是真的,那么这是真的:

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

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

+1

你的类似乎没有超类,所以这将失败。 – Sirs

+9

当然它有一个超类 - 'java.lang.Object' – Bozho

回答

13

方法压倒一切的发生。

所以在这里你将覆盖hashCode(),不toString()

@Override注释是可选的(但一个非常好的事情),并表示这是有望被改写。如果拼写错误或者输入了错误的参数,编译器会发出警告。

所以,是的,第二个说法是正确的(在这种情况下超是java.lang.Object

2

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

不,这不完全正确。

@Overrides注解说:“此方法会覆盖在父类同名方法”。

在这种情况下,hashCodeOvTester优先于hashCodeObject

如果它不是真实的,那么这是真的:在hashCode()方法OvTester必须覆盖其超类中的同名方法?

是的。这正是它的工作原理。


当一个方法没有做别的事情,而不是调用另一个方法(几乎是你在你的例子了)它通常被称为delegate method。也许这就是你混淆这一点。

0

不,这只会意味着hashCode()方法被覆盖。编译器将在编译时检查hashCode()是否真的是一个被覆盖的方法(带有该签名)。

0

@Override只是编译时检查实施者是否真的重写了方法。

,如果你尝试重写

@Override 
public void equals(Object ob){ 

} 

它将无法编译,当你重新定义在sublcass相同签名的方法

1

@Override批注不“确定”任何东西。它只是一个标志,告诉编译器如果注释的方法不覆盖超类或接口方法,则会引发错误。它是开发人员帮助维持理智的工具,除此之外,

在这种特定情况下,仅仅注意到中的hashCode()实现覆盖了Object中定义的hashCode()方法。这与toString()完全没有关系,并且从您的hashCode()方法中调用超类的toString()方法与重写toString()不会有相同之处。

这是真的吗? OvTester中的hashCode()方法必须在其superClass中覆盖相同的 名称方法?

这确实是真的,在这个意义上,注释会导致如果没有在注释方法的签名相匹配的超可重写hashCode()方法编译器产生一个错误。

0

该代码覆盖hashCode()方法构成基类Object类。 toString()方法仍有原始实现。

要覆盖toString(),您执行以下操作:

@Override 
public String toString() { 
    //Your own toString() implememntation here 
} 

只要在子类中的方法具有相同的名称和签名作为父类的方法,而在方法父类是不是私人它将被过度使用(不管是否存在注释@Override