Java的五个基本注解
- @Override
- @Deprecated
- @SuppressWarnings
- @SafeVarargs
- @FunctionalInterface
五个基本注解的用法:
1. @Override 的作用:
告诉编译者应该检查该方法,保证该类的父类中含有一个被该方法重写的方法,否则将编译错误。
@Override 的用法
class A
{
public void info()
{
System.out.print("A的info()方法");
}
}
class B extends A
{
@Override //用该注解指定下面方法应重写父类方法
public void info()
{
System.out.print("B的info()方法");
}
}
public class B0202
{
public static void main(String[] args)
{
new B().info();
}
}
此时编译后可见结果是正常的,但如果在B类重写A类info()方法时格式错误,例如把info写成inFo,则会引发如下错误:
2.@Deprecated的作用:
用于表示某个程序元素已经过时了,若被调用,则编译器会发出警告
@Deprecated的用法
在java9之前,@Deprecated无属性,可直接使用
从java9开始,可为@Deprecated添加两个属性:forRemoval和since
String since:指定该API从哪个版本被标记为过时
boolean forRemoval :指定该API是否会在之后被删除,true为会被删除
class A
{ //若不指定俩属性,则直接写@Deprecated即可
@Deprecated(since="9",forRemoval=true)
public void info()
{
System.out.print("A的info()方法");
}
}
public class B0202
{
public static void main(String[] args)
{
new A().info();
}
}
由于该程序调用了已过时的方法,所以编译器会发出下图所示的警告:
3.@SuppressWarnings 的作用:
用来关闭某程序元素中所有编译器警告
@SuppressWarnings 的用法:
必须使用value=name的形式为该注解的成员变量赋值,指定关闭警告的类型
import java.util.*;
//关闭下面类中的编译器警告
@SuppressWarnings(value="unchecked")
public class B0202
{
public static void main(String[] args)
{
//下面在定义集合中使用泛型时未补充菱形语法
//原本会发出警告
List<String> a=new ArrayList();
}
}
结果正常:
4.@SafeVarargs 的用法:
专门用于修饰引发unchecked警告的构造器或方法,下面程序中 ErrorTest 类的 info 方法传入形参个数可变的数组,但java不支持泛型数组,只能把List< String >当成List[]处理,就发生了“堆污染”,自java7开始,这行代码定义即会被编译器警告,如若不想看到这个警告,除了用上一个注解@SuppressWarnings(value=“unchecked”)外,还可以用注解 @SafeVarargs
@SuppressWarnings(value=“unchecked”)和@SafeVarargs的区别:
(1)@SafeVarargs只能用于修饰方法或者构造器,而@SuppressWarnings除了修饰方法外,还可以修饰类;
(2)@SafeVarargs 专门用于修饰引发unchecked警告的构造器或方法,而@SuppressWarnings调整参数后还可以用于关闭各种各样的警告。
import java.util.*;
class ErrorTest
{ //修饰info方法,关闭unchecked警告
@SafeVarargs
public static void info(List<String>... list)
{
List[] a=list;
List<Integer> myList=new ArrayList<>();
myList.add(new Random().nextInt(100));
a[0]=myList;
Object s=a[0].get(0);
}
}
public class B0202
{
public static void main(String[] args)
{
ErrorTest.info(Arrays.asList("ok"),
Arrays.asList("no"));
}
}
5.@FunctionalInterface 的作用:
用于指定某接口必定是函数式接口(抽象方法只有一个的接口),若超过一个抽象方法,则会引发错误
@FunctionalInterface
interface MyInterface
{
//可以有静态方法和默认方法
static void k1(){}
default void k2(){}
//只能有一个抽象方法
void test1();
//超过一个,则出差
void test2();
}
public class A0203
{
public static void main(String[] args)
{
}
}
上面程序定义了两个抽象方法,引发了如下错误: