1、注解概述
从JDK5.0开始,Java增加对元数据(MetaData)的支持,也就是注解(Annotation)。其实我们早就已经接触过注解了,例如我们经常在Java代码中可以看到 “@Override”,“@Test”等等这样的东西,它们就是Java中的注解。注解可以像修饰符一样使用,可以用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。
我们需要注意的是,注解与注释是有一定区别的,注解就是代码里面的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。而注释则是用以说明某段代码的作用,或者说明某个类的用途、某个方法的功能和介绍,以及该方法的参数和返回值的数据类型及意义等等。
2、Java内置注解
在JavaSE部分,注解的使用往往比较简单,Java中提供了5个内置注解,它们分别是:
①、@Override:标注该方法是重写父类中的方法。
这个注解一个是我们见得最多的一个了,提示这个方法是重写于父类的方法。
②、@Deprecated:标记某个功能已经过时,用于定义过时的类、方法、成员变量等。
这个注解想必大家应该都有碰到过,在使用Date日期类的时候,里面有大量过时的方法,我们来定义一个Date类来调用一个方法。
这个getDay()方法就是过时的,我们点击进去看一下这个方法的源码:
果然这个方法是用@Deprecated修饰过的。同时也可以发现我们在调用过时元素时,编译器在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素,当然如果不想看到警告我们可以抑制它的出现。
③、@SuppressWarnings:抑制编译器警告。
上面说到用@Deprecated修饰过的元素在调用时会有警告,我们可以用@SuppressWarnings注解来抑制警告的出现。
可以发现左边的警告没有了。@SuppressWarnings这个注解中参数非常的多,这里介绍几个常见的参数:
- all:抑制所有警告。
- deprecation:抑制过期方法警告。
- null:忽略对null的操作。
- unchecked:抑制没有进行类型检查操作的警告。
- unused:抑制没被使用过的代码的警告。
如果需要了解更多的可以去查看官方文档。
④、@FunctionaInterface:指定接口必须为函数式接口。
这个注解是Java8出现的新特性。这个函数式接口的意思就是接口中有一个且仅有一个抽象方法,但是可以有多个非抽象方法,如果不定义或定义多个抽象方法就会报错。
正式因为JDK 8中lambda表达式的引入,使得函数式接口在Java中变得越来越流行。因为这些特殊类型的接口可以用lambda表达式、方法引用或构造函数引用轻松替换。
⑤、@SafeVarargs:抑制"堆污染警告"。
这个注解是在Java7中引入,主要目的是处理可变长参数中的泛型,此注解告诉编译器:在可变长参数中的泛型是类型安全的。可变长参数是使用数组存储的,而数组和泛型不能很好的混合使用。因为数组元素的数据类型在编译和运行时都是确定的,而泛型的数据类型只有在运行时才能确定下来,因此当把一个泛型存储到数组中时,编译器在编译阶段无法检查数据类型是否匹配,因此会给出警告信息。
我们来看下面这个示例:
public class Test { @SafeVarargs//这里告诉编译器类型安全,不让有警告。其实方法体内容类型不安全 public static void show(List<String>...lists){ Object[] arry=lists; List<Integer> intList=Arrays.asList(11,22,33); arry[0]=intList;//这里就是堆污染,这里没有警告,是因为只针对于可变长参数泛型 String str=lists[0].get(0);www.yisheng3yul.com/ja