首先看一下下面的示例代码 : Parent.java
IChild.java
Child.java
由于代码很简单,我就不做说明 上述代码在jdk6下可以编译通过 而在jdk5下编译无法通过,输出的错误信息如下: Child.java:7: 方法未覆盖其父类的方法 @Override ^ 1 错误 上面的错误信息说在Child.java第七行的Override注解是不对的,不对的原因是该方法(interfaceMethod)不是父类方法。 当然,实际上这个方法是类实现的接口中方法,但是,这个语法在jdk6的下面是可以通过的,也就是说java6认为类覆盖父类方法与实现接口方法都叫override,而jdk5不是这样认为的,不知道这是当初jdk5的bug,还是当初就是认为覆盖父类方法与实现接口方法是不一样的,不得而知。但是从OO角度来看,覆盖父类方法与实现接口方法都可以认为override,因为他们目的都是一样的,都是为了重用,都是多态的一种表现方式。这从jdk6的支持这个功能就可以看出。 差一点忘了: 标准的java api文档java5与java6对Override annotation的的解释一样的 java5: Indicates that a method declaration is intended to override a method declaration in a superclass. If a method is annotated with this annotation type but does not override a superclass method, compilers are required to generate an error message. java6: Indicates that a method declaration is intended to override a method declaration in a superclass. If a method is annotated with this annotation type but does not override a superclass method, compilers are required to generate an error message. 两段说明一模一样,让人搞不清楚的是java6文档没有提到Override对interface的支持。
在Eclipse或MyEclipse中开发时,尽管使用JDK的版本是JDK1.6,上面的代码还是会通不过编译的,因为你在建工程时,Eclipse默认的编译器使用的是1.4或者1.5,所以你要把编译器的版本修改为1.6才行,MyEclipse是设置成6.0,其实就是1.6Eclipse中的1.6. 解决办法:Windows->Preferences-->java->Compiler-->compiler compliance level设置成6.0就OK了.
结论(个人观点): @Override是JDK5就已经有了,但有个小小的Bug,就是不支持对接口的实现,认为这不是Override .而JDK6修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现都可以加上@Override |
关于解决Java @Override的问题
最新推荐文章于 2022-03-20 13:54:50 发布