注解@Override他是如何判断是否被覆盖,我看注解里没逻辑处理啊

安谧 发布于 2016/10/04 19:25
阅读 624
收藏 0

@Override的注解定义是

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
但是里面并没有提到是如何判断是否覆盖了原来的方法

这部分是java虚拟机里写了自己判断@override的注解信息,虚拟机遇到@override的注解就自己去判断

加载中
0
v若水
v若水
这个注解是给开发工具看的,也就是在编译期间开发工具会检查,其实你生成的class文件是没有这个注解的
0
kakai
kakai
具体说不上,我猜测是在编译阶段自动识别的,其实在java里它只是个代码规范,不一定有用,你要是不写也是没关系的。
0
风华神使
风华神使
不写也不碍事
0
Sel8616
Sel8616

上面都说了——Override可以不写

当编译class时,如果子类的某个方法与父类相同(名称、参数、返回值都一样),则该方法就会覆盖父类方法。

安谧
安谧
这部分工作由编译器自己完成呗
0
红薯官方
红薯官方

具体看Override注解的实现源码:

看这个注解@Retention(RetentionPolicy.SOURCE)

RetentionPolicy.SOURCE 说明这个Override注解之时在编译前的代码上面有存在,编译后就不会再有了。

语法检查的时候使用的,所以虚拟机不会遇到这个东东。

RetentionPolicy.RUNTIME 才是运行时的注解,这种类型的注解会被编译到代码里面,运行的时候依赖于虚拟机或者你的业务代码对这个业务注解进行控制。

0
loyal
loyal
是给IDE使用的
0
DavidWho
DavidWho

注解有多种使用方式,根据有效时间可以分为这几种:

    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在运行时有效(即运行时保留)

而@Override的注解是SOURCE,也就是说只在源码层保留,是为了编程改源码时检测代码是否符合规范(重写于父类)。

以下是API Doc的解释:

@Target(value=METHOD) @Retention(value=SOURCE)
public @interface Override
Indicates that a method declaration is intended to override a method declaration in a supertype. If a method is annotated with this annotation type compilers are required to generate an error message unless at least one of the following conditions hold:
  • The method does override or implement a method declared in a supertype.
  • The method has a signature that is override-equivalent to that of any public method declared in Object.

DavidWho
DavidWho
简单说就是:把Method加上这个标识,IDE就会去检查其父类是否有该Method的同名同参方法可以继承,如果父类没有此方法,则IDE报错
0
南湖船老大
南湖船老大

什么叫注解?脑子要拎清。。

注解就是接口,从定义上就可以看出来。

什么叫接口?

接口就是接口,只定义规范,不定义实现。谁用到接口,谁自己去实现。

爱咋咋地,这个override接口可以是编译器在编译为class期间实现,也可以IDE实现,也可以我们自己实现。

field.isAnnotationPresent(XXOO.class)

一行代码,我就能字自己的代码里获取到有无注解,然后针对性处理。当然,override是SOURCE级别的,到了class级别已经获取不到了。注解的定义和处理是分离的,我随便乱定义一个注解,不作任何处理也是可以的。

是不是很简单啊。

返回顶部
顶部