什么是注解
注解即Annotation,Java从JDK5.0开始引入
Annotation作用:
其一:不是程序本身,可以对程序作出解释(这一点和comment(注释)没什么区别)
其二:不同于注释的是,他可以被其他程序(如:编译器)读取
Annotation格式:
注解是以“@注解名”在代码中存在的,如:
就这种我们程序中非常常见的玩意就是注解,这里的注解就是重写的注解,因为上面的几个方法都是重写的
有的时候注解还需要传入一些参数值,类似于有参函数
Annotation可在哪使用?
可用在包(package)、class、method(方法)、field上面
如上面图片那里的就是用在方法上的注解
注解有内置注解和自定义注解,内置注解是由程序内部定义的,我们可以直接使用,根据需要我们可以自定义注解
几个常用内置注解的举例
@Override
位于java.lang.Override中
此注解用于方法上,表示此方法是重写其他类的方法的,比如我们重写toString
的时候就会出现这个玩意
注意,重写一定要保证遵守重写的几大要素,如果程序不认为你是重写了这个方法,则用@Override
注解,则会报错Deprecated
位于java.lang.Deprecated中
这个注解可以用于方法,属性,类,这个玩意就表示他修饰的东西算是弃用的东西,不推荐程序员使用@SuppressWarnings
位于java.lang.SuppressWarnings中
用于一直编译时的警告信息,如图:
在我们没有用这个注解的时候,可以看到这个类的类名是灰色的,就是因为我们没有调用它,这算是一种警告
然后:
用上这个玩意,颜色就变黑色了,就等于说抑制了警告的提示
这个玩意需要传入一个参数
上文我们传入了一个all
参数,代表抑制所有的警告,这个暂时不用多做了解
元注解
作用:
用于负责注解其他的注解,Java定义了4个标准的meta-annotation类型(元注解),他们被用来提供对其他注解类型作说明
位置:
位于java.lang.annotation中
分别是:
@Target
用于描述注解的使用范围(即,注解可以用在哪些地方)@Retention
用于表示需要在什么级别保存改注释信息,用于描述注解的生命周期(即,注解在什么时候有效,在什么时候还存在)
(RetentionPolicy.SOURCE
(源代码时候)<RetentionPolicy.CLASS
(源码编译为class文件的时候)<RetentionPolicy.RUNTIME
(运行的时候))
有三个级别,如上,更高级的可以运行在更低级的上面,反之不行,一般我们都定义为RetentionPolicy.RUNTIME
如镇压警告的注解:红笔注出来的第一行,即表示注解适用于哪些地方,括号中传入的是参数,这里是一个数组。第二行即表示他的效果范围,因为镇压警告只需要用于源码的地方,所以,只需要参数RetentionPolicy.SOURCE
就行
注意,最下面的那个String[] value()表示为此注解定义了一个String数组类型的形参,这里和Java谱图代码中不同,这里value()即表示定义一个名叫value的形参
@Document
说明该注解将被包含在javadoc中@Inherited
说明子类可以继承父类中的该注解
自定义注解
- 使用
@interface
关键字,格式public @interface 注解名{定义内容}
,public不是必要的,在某些时候不能加public
如:
这种时候,一个类里面不能有两个public,所以这里报错了,所以这里定义的注解不能加public - 其次,参数问题
注意注解中的这个地方,像这样的都是参数,可以叫value,也可以为其他名字
但是!!!这里面有个不成文的规定,正常来说,调用注解向里面传参数的话,需要这样:
即括号中写入形参名=实参
,但是,如果你的形参叫value
则,不需要写这个形参,直接向里面传就行 - 可以通过default来声明参数的默认值
如果我们调用带有参数且没有默认值的注解,又不向里面传入参数,则程序会报错,但是如果我们此注解具有默认值,则传参数就不是必须的了
尝试:如图