目录
(1) 注解(Annotation)也被称为元数据(Metadata),用于修饰包、方法、属性、构造器、局部变量等数据信息。
(2) 注解不影响程序逻辑,但注解可以被编译或运行。
(3) 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等
举例①: 对于@Override注解 限定某个函数必须重载其他函数,该注解只能用于函数
- //本例中所作的是在子类ColorPoint中 重写 基类Point 中的getString()函数
- class Point {
- public int x;
- public int y;
-
- public String getString(){
- return String.format("(%d,%d)",x,y);
- }
- }
- class ColorPoint extends Point{
- private String color;
-
- @Override
- public String getString(){ //重写Point中的getString()函数
- return String.format("(%d,%d,%s)",super.x,super.y,color);
- }
-
- }
当然,我们更多用到的是对java自带函数重写,如compareTo() 和 toString() 函数,
比如 当我们想要对多个点进行排序,点中含有x、y两个关键字
要按第一关键字正序排序,若第一关键字相等则比较第二关键字:
- package org.example;
-
- import java.lang.reflect.Array;
- import java.util.Arrays;
-
- class Point implements Comparable
{//使用Comparable接口重写toCompare(obj)方法 - public int x;
- public int y;
- public Point(int x,int y){
- this.x = x;
- this.y = y;
- }
- @Override //重写toString函数
- public String toString() {
- return String.format("x: %d y: %d \n",x,y);
- }
-
- @Override
- public int compareTo(Point o) { //重写compareTo函数
- if(this.x > o.x)
- return 1;
- if(this.x < o.x)
- return -1;
- if(this.y > o.y)
- return 1;
- if(this.y < o.y)
- return -1;
- return 1;
- }
- }
-
- public class Main {
- public static void main(String[] args) {
- Point[] arr = new Point[]{new Point(7,2),new Point(5,4),new Point(5,2)};
- Arrays.sort(arr);//排序
- System.out.println(Arrays.toString(arr));//输出
- }
- }
- //输出:
- [x: 5 y: 2
- , x: 5 y: 4
- , x: 7 y: 2
- ]
举例②: 对于@Deprecated 用于表示某个程序元素(类、函数)已过时
可以看到调用添加@Deprecated注解的方法时,会出现该方法已被弃用
与@Override不同的是,该注释不仅能标志在函数上,还能标志在类上,表示某个类已过时
这是因为它们的 元注解 不同 第三节中会提到.
举例③ 对于@SuppressWarnings:抑制编译器警告
如图,我们可以把 例子② 中getString()方法弃用的警告抑制,而不显示
修饰其他注解的注解,就被称为元注解。
(1) Retention:指定注解的作用范围
(2) Target:指定注解可以用在哪些地方
(3) Document:注定注解是否出出现在javadoc中
(4) Inherited:子类会继承父类的注解
接第二节 @Override 为什么只能修饰方法 ,我们可以按住ctrl键点击@Override 康康它的具体实现:
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.SOURCE)
- public @interface Override {
- }
可以看到,@Override注解 只能用在ElementType.METHOD, 即只能用在方法类型上,
同时在 RetentionPolicy.SOURCE, 即源码阶段阶段调用该注解
同样的 对于@Deprecated注解:
- @Documented
- @Retention(RetentionPolicy.RUNTIME)
- @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
- public @interface Deprecated {
- }
由Target()注解可知 @Deprecated注解可以用在 构造器、成员变量、局部变量、方法、包、函数参数类上
同时 在RetentionPolicy.RUNTIME 即运行阶段调用该注解
其它注解同理。