Annotation:从JDK1.5开始增加的写在代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用Annotation可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息,供分析工具、开发工具和部署工具进行验证或部署。
1.@Override
用来指定方法重写,强制一个子类必须覆盖父类的方法,否则就会编译出错。
2.@Deprecated
用于表示某个程序元素(类、方法等)已过时,当其他程序使用已过时的这些程序元素时,编译器将会给出警告。
注:@Deprecated与文档注释中的@deprecated作用基本相同,但用法不同,前者从JDK1.5开始支持,直接用于修饰方法、类、接口等;后者需要放在文档注释/**...*/中。
public class TestDeprecated {
public static void main(String[] args) {
test1();
test2();
}
@Deprecated
public static void test1(){
System.out.println("此方法已过时");
}
/**@deprecated*/
public static void test2(){
System.out.println("此方法已过时");
}
}
3.@SuppressWarnings
指示被改Annotation修饰的程序元素(以及该程序元素中的所有子元素)取消显示指定的编译器警告。
当使用@SuppressWarnings Annotation来关闭编译器警告时,一定要在括号里使用name=value的形式为该Annotation的成员变量设置值。
public class TestSupressWarnings {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) {
Book book = new Book();
book.setName("Java");
}
}
class Book<T>{
@SuppressWarnings("unused")
private T name;
public void setName(T name) {
this.name = name;
}
}
4.@SafeVarargs
堆污染(Heap Pollution):当把一个不带泛型的对象赋给一个带泛型的变量时,往往就会发生这种“堆污染”。
public class HeapPollution
{
// @SafeVarargs
public static void faultyMethod(List<String>... listStrArray)
{
// Java语言不允许创建泛型数组,因此listArray只能被当成List[]处理
// 此时相当于把List<String>赋给了List,已经发生了“擦除”
List[] listArray = listStrArray;
List<Integer> myList = new ArrayList<Integer>();
myList.add(new Random().nextInt(100));
// 把listArray的第一个元素赋为myList
listArray[0] = myList;
String s = listStrArray[0].get(0);
}
public static void main(String[] args) {
faultyMethod(Arrays.asList("Hello"),Arrays.asList("World!"));
}
}
由于该方法有个形参是List<String>...类型,个数可变的形参相当于数组,但Java又不支持泛型数组,因此程序只能把List<String>...当成List[]处理,这里就发生了“堆污染”。从Java7开始,Java编译器会在定义该方法时就发出“堆污染”警告:
如图,可使用如下方式来压制警告:
- 使用@SafeVarargs修饰引发该警告的方法或构造器。
- 使用SuppressWarnings("unchecked")修饰。(Java7开始)