Java的自带注解Annotation(一)

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

上一章简单介绍了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系统自带的三个注解,就讲解这么多。


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章