Java的注解 Annotation 是在 JDK 1.5 的时候引入的。
我们在学习框架的时候,尤其是 Spring 框架的时候,会有很多很多的注解, 如 @Resource, @Autowired ,@RequestMapping 等,在类或者属性,或者方法上面,添加了这些注解,这可以标识这些类,属性,方法,使它们具有一些特殊的意义。 这就是注解。
Java 自带了 三个注解 @Override, @Deprecated ,@SuppressWarnings 三个注解。
老蝴蝶和大家学习一下,这三个注解。
一. @Override 注解
一.一 注解的定义
@Override 注解,是重写方法时使用的。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
@Target 表示放置的位置, 后面跟的是 METHOD, 表示只能放置在方法上面 。
@Retention 后面跟的是 SOURCE, 资源,表示只在源文件里面出现。
关于 @Target 和 @Retention 详细是什么意思,后面老蝴蝶会讲解的。
在方法上面,添加这些注解,这表示这个方法是继承父类或者父接口的。
一.二 演示注解@Override
有一个简单的抽象父类 Person, 里面有 id,name,sex,age,desc 五个属性,还有一个抽象方法 getInfo(), 一个普通方法 sayHello()
//前面的代码 ... //返回信息 public abstract String getInfo(); public String sayHello(String name){ return "你好,"+name+",我是"+getInfo(); } ... //后面的代码
还有一个子类 Student, 继承 Person 类,重写 getInfo() 方法 和 sayHello() 方法
public class Student extends Person { @Override public String getInfo() { return "两个蝴蝶飞"; } //返回 name, 重写父类的方法 public String sayHello(String name){ return name; } }
会发现, getInfo() 方法上面这有这么一个 @Override 注解。 这个注解,表示这个方法 getInfo() 是重写父类的,如果父类没有这个方法,那么就报错。
就拿下面的 sayHello() 方法进行举例, 现在 父类里面也有 sayHello() 方法, 那么就可以在这个方法上面添加 这个注解。
//返回 name, 重写父类的方法 @Override public String sayHello(String name){ return name; }
没有报错。
但如果一不小心,把 sayHello()方法写错了, 如写成了 sayhello()了, 那么这会在编译时提示报错
Method does not override method from its superclass
因为在 sayhello()方法上面添加了这个注解,就表示这个方法是从父类或者接口那里重写过来的,并不是子类特有的,而这个sayhello()方法,父类并没有,所以报错。
简单来说, @Override 注解,就是保证重写方法的正确性,保证程序运行正确,避免方法名写错的情况。
老蝴蝶建议,重写父类方法或者实现接口时, 在方法上面都添加这么一个注解,表示这个方法的来源。
二. @Deprecated 注解
二.一 注解的定义
@Deprecated 注解,表示不建议使用的一个操作, 是对一些过时或者不安全的类,方法,属性进行提示。
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE}) public @interface Deprecated { }
@Documented 表示文档
@Retention 表示在执行时出现
@Target 表示放置位置 可以是 构造方法,属性,局部变量,方法,包,参数,类型上面。 标识范围比较广。
二.二 演示@Deprecated
@Deprecated 注解,可以标识 JDK 自带的,也可以是用户自定义的。 如果加上了这个注解,在后面调用时,该代码上面会有一条横线,表示过时的意思。
二.二.一 系统自带的过时
最常见的,就是 java.util.Date 类了。
点进去,查看源代码
@Deprecated public String toLocaleString() { DateFormat formatter = DateFormat.getDateTimeInstance(); return formatter.format(this); }
会发现,该方法上面有 @Deprecated 注解。
注意,过时并不代码不能用,更不代表是错误, 但建议还是不用过时的方法。
二.二.二 用户自定义过时
如刚才的 Student 子类, 在类上面和方法上面,加上这么一个注解
//添加到类上面 @Deprecated public class Student extends Person { //添加到方法上 @Deprecated @Override public String getInfo() { return "两个蝴蝶飞"; } //返回 name, 重写父类的方法 @Override public String sayHello(String name){ return name; } }
那么在实例化这个类,调用这个方法时
上面会有这么一个横线
包下查看类时,发现也会这么一个横线
三. @SuppressWarnings 注解
三.一 注解定义
三.一.一 定义
@SuppressWarnings, 表示 压制警告, 使警告消失(是一种自我欺骗)。
在我们写代码时,就像使用 java.util.Date 类时, 常常会有上面的过时方法使用,那么在运行程序时,就会报警告。虽然警告并不是错误,但是有些开发者,如老蝴蝶自己,就不喜欢警告,如果能够把这些常见的警告给弄消失了,不就可以了吗? @SuppressWarnings,就应用而生了。
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings { //属性 String[] value(); }
@Target, 表示可以应用在类型,属性,方法,参数,构造方法,局部变量上面。
@Retention 表示只出现在源文件里面。
注意,注解里面定义的是 数据类型 属性, 指 有一个 value 属性,类型是 字符串数组,并不是方法。这个特别要注解。
如果属性没有默认值,则必须放置值。
三.一.二 value 值常用取值
该 value 属性值有以下几种范围值
三.二 演示注解
三.一.一 演示 deprecation
添加 压制注解
三.一.二 演示 unchecked 和 rawtypes
添加警告
也可以直接 all
关于Java系统自带的三个注解,就讲解这么多。
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!