2017-11-25 248 views
2

提供类MyClass,我没有重新定义equals()和hashCode()方法,但我忘了提及的关键词@Override如:忘记提@覆盖,同时重新定义equals和hashCode

public class MyClass { 
    public boolean equals(Object obj){ 
     //Content omitted 
    } 

    public int hashCode(){ 
     //Content omitted 
    } 

    //Remainder omitted 
} 

会是什么在MyClass的设计中出现这种错误的后果是什么?

UPDATE:如果我尊重父类的方法签名,同时重新定义我的方法的亚型类,我还是重写给定的方法,虽然我不提@Override关键字,对不对?

+0

没什么,真的。 '@ Override'只是告诉读者你的代码的一种方式,它覆盖了超类中的一个方法。 – Sweeper

回答

3

@Override注释可以防止意外更改。 例如, 您可能会无意中重命名方法 或更改其可见性,参数列表或返回类型。

如果没有@Override注释, 编译器将不会提出有关此类更改的任何问题, 但可能您的程序将不再按预期工作。 而且可能很难检测到由此类更改引起的错误。 例如,应该相等的两个实例 将不再相同,因为Object.equals将用于比较而不是MyClass.equals

随着@Override注释, 编译器将能够告诉你出事了, 任何上述变化将很可能导致不父类匹配任何方法的方法声明, 这是编译时错误。

换句话说, 加入@Override注释, 即使可选的,因为在这个例子中, 是为自己的保护。

相关问题