诸恶莫作,众善奉行,自净其意,是诸佛教
劝诸君,多行善事积福报,莫作恶

上一章简单介绍了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()了, 那么这会在编译时提示报错

Java的自带注解Annotation(一)_Override注解

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 类了。

Java的自带注解Annotation(一)_Deprecated注解_02

点进去,查看源代码

@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;
}

}

那么在实例化这个类,调用这个方法时

Java的自带注解Annotation(一)_Deprecated注解_03

上面会有这么一个横线

包下查看类时,发现也会这么一个横线

Java的自带注解Annotation(一)_Deprecated注解_04

三. @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

Java的自带注解Annotation(一)_Override注解_05

添加 压制注解

Java的自带注解Annotation(一)_Deprecated注解_06

三.一.二 演示 unchecked 和 rawtypes

Java的自带注解Annotation(一)_Override注解_07

添加警告

Java的自带注解Annotation(一)_注解Annotation_08

也可以直接 all

Java的自带注解Annotation(一)_Override注解_09

关于Java系统自带的三个注解,就讲解这么多。



谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!