Java 内置注解
什么是Java内置注解?
Java内置注解是Java语言本身提供的、已经定义好的注解,开发者可以直接在代码中使用这些注解,而无需自行定义。这些注解为编译器提供了额外的信息,帮助进行代码检查,或者在运行时提供特定的处理逻辑。
内置注解是Java注解体系的基础部分,了解并正确使用这些注解能够提高代码的质量和可维护性。
Java 常用内置注解
Java提供了几种重要的内置注解,这些注解在日常编程中经常被使用:
1. @Override
@Override
注解用于标记一个方法是重写(覆盖)了父类中的方法。
public class Animal {
public void makeSound() {
System.out.println("动物发出声音");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("汪汪汪");
}
}
提示
使用@Override注解的好处:
- 编译器会检查被注解的方法是否真的重写了父类的方法
- 如果拼写错误或方法签名不匹配,编译器会报错
- 提高代码可读性,明确表示这是一个重写方法
2. @Deprecated
@Deprecated
注解表示被标记的元素(类、方法、字段等)已过时,不推荐使用。
public class Calculator {
/**
* @deprecated 此方法存在精度问题,请使用 {@link #divideExact(double, double)} 代替
*/
@Deprecated
public double divide(int a, int b) {
return a / b;
}
public double divideExact(double a, double b) {
return a / b;
}
}
使用@Deprecated
注解的元素在IDE中通常会显示为删除线,并在编译时生成警告。
备注
从Java 9开始,@Deprecated注解增加了两个属性:
forRemoval
:表示该API在未来版本是否会被移除since
:表示从哪个版本开始被废弃
3. @SuppressWarnings
@SuppressWarnings
注解用于抑制编译器警告。当你确定某个警告可以忽略时,可以使用此注解。
public class WarningExample {
@SuppressWarnings("unchecked")
public List<String> createLegacyList() {
// 使用原始类型,通常会产生未检查的类型转换警告
List list = new ArrayList();
list.add("Hello");
list.add("World");
return list;
}
@SuppressWarnings({"unused", "deprecation"})
public void multipleSuppress() {
// 抑制多种类型的警告
// ...
}
}
常见的警告类型包括:
unchecked
: 未检查的类型转换deprecation
: 使用了废弃的APIunused
: 未使用的变量rawtypes
: 使用了原始类型resource
: 未关闭的资源all
: 抑制所有警告
警告
虽然@SuppressWarnings可以消除编译警告,但应该谨慎使用。警告通常表示可能存在的问题,不应该无理由地忽略它们。
4. @SafeVarargs
@SafeVarargs
注解用于抑制与可变参数相关的未检查警告。它只能应用于无法被覆盖的方法(如final方法、静态方法或构造函数)。
public class SafeVarargsExample {
@SafeVarargs
public final <T> List<T> asList(T... elements) {
List<T> result = new ArrayList<>();
for (T element : elements) {
result.add(element);
}
return result;
}
}
5. @FunctionalInterface
@FunctionalInterface
注解表示一个接口是函数式接口,即只包含一个抽象方法的接口。这样的接口可以使用Lambda表达式来实现。
@FunctionalInterface
public interface Calculator {
int calculate(int a, int b);
// 允许定义默认方法
default void printInfo() {
System.out.println("这是一个计算器接口");
}
// 允许定义静态方法
static Calculator addition() {
return (a, b) -> a + b;
}
}
// 使用Lambda表达式实现函数式接口
public class FunctionalInterfaceDemo {
public static void main(String[] args) {
Calculator add = (a, b) -> a + b;
Calculator subtract = (a, b) -> a - b;
System.out.println("10 + 5 = " + add.calculate(10, 5));
System.out.println("10 - 5 = " + subtract.calculate(10, 5));
}
}
输出:
10 + 5 = 15
10 - 5 = 5
备注
如果一个接口被@FunctionalInterface注解标记,但它包含多个抽象方法,编译器会报错。