1、什么是注解
注解:注解是给程序看的,编译后依然存在。
@Controller 、@RequestMapping() -----Spring程序看的
@Override、 @Overload ------JVM虚拟机看的。
重写(Override)的特点:
- 方法名要和父类被重写的方法名一致。
- 参数列表要一致。
- 返回值要一致。
- 访问修饰符不能小于父类访问修饰符。
- 抛出的异常不能大于父类异常。
重载( Overload)的特点:
- 必须是两个以上同名的方法。
- 方法之间的参数不同(类型不同或者数量不同)。
- 方法的返回值不能作为判断方法之间是否构成重载的依据。
1.1注解的分类
- 预定义注解:------JDK自带的一些常用注解。
- 自定义注解:------我们自己定义的注解。
- 元注解:------注解上使用的注解。
1.1.1预定义注解
- @Override:表示方法重写,使用该注解必须符合重写的规则。
- @Deprecated:表示已过时,告诉使用者该方法已过时。
- @SuppressWarnings:表示压制警告。
- @FunctionInterface:函数式接口注释。使用该注解表明接口中只能有一个抽象方法。(1.8以后)
1.1.2自定义注解
声明注解格式:
public @interface 注解名{
数据类型 属性名();
}
自定义的注解默认对代码没有任务影响,如果想让注解有意义,必须解析该注解。我们可以结合反射,来解析这些注解。
数据类型可以为哪些?
基本数据类型, 字符串类型,枚举类型,注解类型,以及这些类型的数组类型。
定义注解(MyAnnotation)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
int age(); //基本类型
String name();//字符串类型
MyEnum address();//枚举
My my();//注解类型
int[] ages();
String[] names();
}
注解的属性定义好后,使用该注解时,需要指定属性的值
//如果属性为数组类型,给数组类型赋值时如果只有一个值那么可以省略{}
//如果注解中只使用value属性,那么value属性名可以省略。
@MyAnnotation(age=15,name="张三",address = MyEnum.BEIJING,my=@My,ages={5,10,15},names="hello")
public class Student {
public void show(){
System.out.println("hello world");
}
}
1.1.3元注解
使用在注解上的注解就是元注解。
@Target:作用:告诉该注解的使用范围。默认所有。
Type:可以使用在类上
FIELD:使用在属性上
METHOD:使用在方法上
PARAMETER:使用在方法参数上
CONSTRUCTOR:使用在构造方法上
@Retention:作用:该注解什么时候有效。默认SOURCE(源文件)
SOURCE:源码时有效
CLASS:字节码时有效
RUNTIME:运行时有效。【采用的最多】
@Documented:作用:代码生成api文档时需要。