诸恶莫作,众善奉行,自净其意,是诸佛教
劝诸君,多行善事积福报,莫作恶
上一章简单介绍了TCP实现聊天室(五),如果没有看过,请观看上一章
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 属性值有以下几种范围值
value 值 |
作用 |
deprecation |
使用时不赞成,过时的类,方法时的警告 |
unchecked |
未检查转换时的警告,如泛型操作中没有指定具体的泛型类型 |
fallthrough |
switch 直接向下,没有break 时 |
path |
类路径,源文件路径等有不存在的路径时的警告 |
serial |
在可序列化类上缺少 serialVersionUID 属性时的警告 |
finally |
try catch finally 语句时 finally 语句不能正常完成时的警告 |
rawtypes |
泛型化参数未指定具体的类型 |
unused |
未被使用 |
all |
以上所有的情况时的警告 |
三.二 演示注解
三.一.一 演示 deprecation
添加 压制注解
三.一.二 演示 unchecked 和 rawtypes
添加警告
也可以直接 all
关于Java系统自带的三个注解,就讲解这么多。
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!