注解(Java)

注解(Java)

1.什么是注解:

  • 注解,可以看作是对 一个 类/方法 的一个扩展的模版,每个 类/方法 按照注解类中的规则,来为 类/方法 注解不同的参数,在用到的地方可以得到不同的 类/方法 中注解的各种参数与值

  • 注解也就是Annotation,相信不少人也和我之前一样以为和注释和doc一样,是一段辅助性的文字,其实注解不是这样的。

  • 从JDK5开始,java增加了对元数据(描述数据属性的信息)的支持。其实说白就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进

2.基本的Annotation

java提供了5个基本的注解,分别是:

1.@Override

2.@Deprecated

3.@SuppressWarnings

4.@SafeVarargs

5.@FunctionalInterface

1.限定父类重写方法:@Override

  • 当子类重写父类方法时,子类可以加上这个注解,那这有什么什么用?这可以确保子类确实重写了父类的方法,避免出现低级错误

2.标示已过时:@Deprecated

  • 这个注解用于表示某个程序元素类,方法等已过时,当其他程序使用已过时的类,方法时编译器会给出警告(删除线,这个见了不少了吧)。

3.抑制编译器警告:@SuppressWarnings

  • 被该注解修饰的元素以及该元素的所有子元素取消显示编译器警告,例如修饰一个类,那他的字段,方法都是显示警告

4.“堆污染”警告与@SafeVarargs

  • 想理解这个就要明白什么是堆污染,堆污染是什么?其实很好理解,就是把不带泛型的对象赋给一个带泛型的对象,为什么不行?很简单,因为不带泛型的话,默认会给泛型设定为object,意思就是什么类型都可以往里面塞,那你一个不带泛型的怎么可能给一个带泛型塞呢。

  • 注意:可变参数更容易引发堆污染异常,因为java不允许创建泛型数组,可变参数恰恰是数组。
    抑制这个警告的方法有三个:

    1.@SafeVarargs修饰引发该警告的方法或构造器

    2.使用@suppressWarnings(“unchecked”)

    3.编译时使用-Xlint:varargs

5.函数式接口与@Functionallnterface

  • 什么是函数式?如果接口中只有一个抽象方法(可以包含多个默认方法或多个static方法)

  • 接口体内只能声明常量字段和抽象方法,并且被隐式声明为public,static,final。

  • 接口里面不能有私有的方法或变量。

  • 这个注解有什么用?这个注解保证这个接口只有一个抽象方法,注意这个只能修饰接口

代码示例1:

package Demo01;

import java.awt.*;

//什么是注解
public class Test01 extends Object {
    // @Override 重写的注解
    @Override
    public String toString() {
        return super.toString();
    }

    //不推荐程序员使用,但是可以使用   或者存在更好的方式
    @Deprecated
    public static void test(){
        System.out.println("@Deprecated");

    }

    @SuppressWarnings("all")
    public void test02(){
     List list=new List();
    }

    public static void main(String[] args) {
        test();
    }
}

代码示例2:

package Demo01;

import java.lang.annotation.*;

//测试元注解
@MyAnnotation
public class Test02 {
    public void test(){
    }
}
//定义一个元注解
//Target 表示我们的注解可以用在哪些地方
@Target(value ={ElementType.METHOD,ElementType.TYPE})

//@Retention 表示我们的注解在哪些地方有效
//(SOURCE<CLASS<RUNTIME)
@Retention(value = RetentionPolicy.RUNTIME)

//@Documented 表示我们的注解是否生成在Javadoc中
@Documented

//@Inherited 表示子类可以继承父类的注解
@Inherited

@interface MyAnnotation{

}

代码示例3:

package Demo01;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//测试自定义注解
public class Test03 {
    //注解可以显示定义,如果没有默认值,我们就必须给注解赋值
    @MyAnnotation2(schools = {"xx大学"}) //若有默认值default 可以不加name="你好"
    public void test(){ }

    @MyAnnotation3("你好")  //只有一个值的情况
     public  void test2(){}
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
    //注解的参数:参数类型+参数名()
    String name() default "";
    int age() default 0;
    int id() default -1;//如果默认值为-1  代表不存在。indexof--如果找不到就返回-1

    String[] schools() default {"北华"};
}

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3{
    String value(); //只有一个值的情况

}
上一篇:《数据结构》第八章算法设计题--栈和队列


下一篇:97Echarts - 地理坐标/地图(Draw Polygon on Map)