尽管该类B实现了该接口A,但它不提供该方法的实现show()。再次说明,DextendsC在类D中的实现与其父类displayNothing()中displayNothing()method的实现相同C。但是在这两种情况下,@Override注释都能正常工作,为什么?//code snippet 1interface A{ void show();}abstract class B implements A{ @Override abstract public void show(); }//code snippet 2class C{ void displayNothing() { }}class D extends C{ @Override void displayNothing() { }}
2 回答
阿晨1998
TA贡献2037条经验 获得超6个赞
@Override仅困扰您的函数名称以及数据类型是否与您的超类中的方法相同(无字母错误)。您的情况是相同的。尝试在类D中将void更改为int。它显示了编译错误。至于您的抽象类方法,它不需要定义任何东西,因为名称可以说明一切,它是abstract。
慕的地8271018
TA贡献1796条经验 获得超4个赞
B是抽象的。抽象类不需要提供实现。如果抽象类未实现必需的方法,则无关紧要。如果一个类不是抽象的,则所有抽象方法的实现都必须存在。
D提供C中的displayNothing方法的替代。编译器不检查替代版本是否与替代版本相同,并且不关心替代实现是否为空。Override批注所做的全部工作就是确认在类层次结构中,被批注的方法上方有一个具有相同签名的方法。
注释的目的是确认您实际上是在覆盖现有方法,并且没有通过拼写错误的方法名称或与您要覆盖的方法的签名不匹配而引入错误。请参阅Java语言规范9.6.4.4,其中指出:
程序员在打算覆盖方法声明时,有时会重载方法声明,从而导致细微的问题。注释类型“覆盖”支持及早发现此类问题。
经典示例涉及equals方法。程序员在Foo类中编写以下内容:
public boolean equals(Foo that) { ... }
当他们打算写的时候:
public boolean equals(Object that) { ... }
这是完全合法的,但是Foo类从Object继承了equals实现,这可能会导致一些非常微妙的错误。
(请注意,当我描述@Override是什么时,我跳过了override-equivalence,因为您没有询问它,并且已经有非常好的答案可以解决此问题。
添加回答
举报
0/150
提交
取消