目录
注释:注释是存在于源文件的给其他程序员看的,如果你换个文件(从.java换到.class)打开,注释就不存在了。
注解:注解不仅是给人看的,也是给编译器看的。例如,告诉编译器不需要检查此段代码的的格式等等。
注解是一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。和注释不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。
主要作用:
1、编译格式检查
2、反射中解析
3、生成帮助文档
4、跟踪代码依赖
一、内置注解
就是系统已经存在的注解,我们可以直接拿来用。
1、@Override : 重写
定义在java.lang.Override。
是用来检查重写格式是否正确的注解。
eg:
如果我们将toString改成toString1则报错,因为toString有父类,但toString1没有!所以报错。
2、 @Deprecated:废弃
定义在java.lang.Deprecated
表示这个方法已经不建议用了,比如,一开始写了一个方法,你一直在用,一直都没有bug,但是有一天,你用在新的情境下,突然就出了bug。这时候,你不能删除,也不能改。(因为前面一直在用,改了可能出新bug)所以,这时候,你把它标记为废弃。这样,别人要用这个方法的时候,编译器就会提醒他,这个方法已经被废弃。不建议使用。但是硬要用,还是可以用的,因为方法本身并没有删除。
eg:写一个Person类:废弃setAge,新写一个setAge2.
class Person {
int age;
public int getAge() {
return age;
}
/**
* 此方法被废弃,请用setAge2
* @param age
*/
@Deprecated
public void setAge(int age) {
this.age = age;
}
public void setAge2(int age) {
if(age<0||age>150){
throw new RuntimeException("年龄不合理");
}
this.age = age;
}
}
这样,在main中想用setAge时,就会:不建议用!
3、@FunctionalInterface: 函数式接口 *
Java 8 开始支持,标识一个匿名函数或函数式接口。
用来提醒这是一个函数式的接口
4、SuppressWarnings:抑制编译时的警告信息。 *
定义在java.lang.SuppressWarnings
三种使用方式
1. @SuppressWarnings("unchecked") [^ 抑制单类型的警告]
2. @SuppressWarnings("unchecked","rawtypes") [^ 抑制多类型的警告]
3. @SuppressWarnings("all") [^ 抑制所有类型的警告]
eg:我们在创建一个对象/方法等一些东西时,如果后面没有用到则会收到警告,告诉我们,从来没用过,删了吧。
这时候,如果我们想忽略警告,就需要加上注解SuppressWarnings
这时,就不会再有警告了。
这就是我们常用的能用得到的注解。
二、自定义注解
一、元注解
元注解是作用在其他注解的注解。
1、@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可
以通过反射访问。
2、@Documented - 标记这些注解是否包含在用户文档中 javadoc。
3、@Target - 标记这个注解应该是哪种 Java 成员。
4、@Inherited - 标记这个注解是自动继承的:
4.1. 子类会继承父类使用的注解中被@Inherited修饰的注解
4.2. 接口继承关系中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有被@Inherited修饰
4.3. 类实现接口时不会继承任何接口中定义的注解
注解定义格式:
@interface 自定义注解名{}
注意事项:
1. 定义的注解,自动继承了java.lang,annotation.Annotation接口
2. 注解中的每一个方法,实际是声明的注解配置参数
·方法的名称就是 配置参数的名称
·方法的返回值类型,就是配置参数的类型。只能是:基本类型/Class/String/enum
3. 可以通过default来声明参数的默认值
4. 如果只有一个参数成员,一般参数名为value
5. 注解元素必须要有值,我们定义注解元素时,经常使用空字符串、0作为默认值。
@Target({ElementType.TYPE,ElementType.METHOD})
//第一个参数表示,这个注解可以加在类上,第二个参数表示,这个注解可以加在方法上
@Documented //允许继承在文档里
@Retention(RetentionPolicy.RUNTIME) //保存策略为RUNTIME,如下面的图!
@Inherited //可以继承
@interface MyAnnotation{ //注解内容
String value();
int num();
//注解配置参数
}
我们用注解时,要传入参数:(给这个类用注解)
@MyAnnotation(value = "haha",num = 13) //如果不写value=,num=那么默认为value的值
public class Demo2 {
public static void main(String[] args) {
}
}
如果不想必须传参数,我们也可以给参数设默认值:调用时,传入参数则用新参数代替默认参数。如果不传参数,则使用默认参数。
@interface MyAnnotation{ //注解内容
String value() default "heiehi"; //用default加默认值
int num() default 0;
//注解配置参数
}
RetentionPolicy保存策略:RUNTIME为最大范围,包含CLASS包含SOURCE。CLASS包含SOURCE。一般我们都用最大范围,即RUNTIME
这就是注解,可能很多地方都看不明白。建议看下篇《反射》,看完再回来二次理解。搭配使用