Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
Java SE API 中预定义了一组注解类型。Java 编译器使用某些注解类型,有些注解类型适用于其他注解。
java.lang
中定义的预定义注解类型是 @Deprecated
,@Override
和 @SuppressWarnings
。
@Deprecated @Deprecated
注解表示标记的元素 deprecated (弃用) 且不应再使用。只要程序使用带有 @Deprecated
注解的方法,类或字段,编译器就会生成警告。不推荐使用元素时,还应使用 Javadoc @deprecated
标记对其进行记录,如以下示例所示。在 Javadoc 注解和注释中使用 at 符号(@
)并非巧合:它们在概念上是相关的。另请注意,Javadoc 标记以小写 d 开头,注解以大写 D 开头。
// Javadoc comment follows /** * @deprecated * explanation of why it was deprecated */ @Deprecated static void deprecatedMethod() { } }
@Override @Override
注解通知编译器该元素是用来覆盖超类中声明的元素。覆盖方法将在 Interfaces and Inheritance 中讨论。
// mark method as a superclass method // that has been overridden @Override int overriddenMethod() { }
虽然在重写方法时不需要使用此注解,但它有助于防止出错。如果标有 @Override
的方法无法正确覆盖其某个超类中的方法,则编译器会生成错误。
@SuppressWarnings @SuppressWarnings
注解告诉编译器抑制将会生成的特定警告。在以下示例中,使用了不推荐使用的方法,编译器通常会生成警告。但是,在这种情况下,注解会导致警告被抑制。
// use a deprecated method and tell // compiler not to generate a warning @SuppressWarnings("deprecation") void useDeprecatedMethod() { // deprecation warning // - suppressed objectOne.deprecatedMethod(); }
每个编译器警告都属于一个类别。Java 语言规范列出了两个类别:deprecation
和 unchecked
。当与 generics 出现之前编写的遗留代码接口时,可能会发生 unchecked
警告。要禁止多种类别的警告,请使用以下语法:
@SuppressWarnings({"unchecked", "deprecation"})
@SafeVarargs @SafeVarargs
注解,当应用于方法或构造函数时,断言代码不会对其 varargs
参数执行潜在的不安全操作。使用此注解类型时,将禁止与 varargs
用法相关的未经检查的警告。
@FunctionalInterface Java SE 8 中引入的 @FunctionalInterface
注解表明类型声明旨在成为一个函数式接口,由 Java 语言规范定义。
适用于其他注解的注解称为 meta-annotations (元注解)。在 java.lang.annotation
中定义了几种元注解类型。
@Retention @Retention
注解指定标记注解的存储方式:
RetentionPolicy.SOURCE
- 标记的注解仅保留在源级别中,并被编译器忽略。RetentionPolicy.CLASS
- 标记的注解在编译时由编译器保留,但 Java 虚拟机(JVM)会忽略。RetentionPolicy.RUNTIME
- 标记的注解由 JVM 保留,因此运行时环境可以使用它。@Documented @Documented
注解表示无论何时使用指定的注解,都应使用 Javadoc 工具记录这些元素。(默认情况下,注解不包含在 Javadoc 中。)有关更多信息,请参阅 Javadoc tools page。
@Target @Target
注解标记另一个注解,以限制可以应用注解的 Java 元素类型。目标注解指定以下元素类型之一作为其值:
ElementType.ANNOTATION_TYPE
可以应用于注解类型。ElementType.CONSTRUCTOR
可以应用于构造函数。ElementType.FIELD
可以应用于字段或属性。ElementType.LOCAL_VARIABLE
可以应用于局部变量。ElementType.METHOD
可以应用于方法级注解。ElementType.PACKAGE
可以应用于包声明。ElementType.PARAMETER
可以应用于方法的参数。ElementType.TYPE
可以应用于类的任何元素。@Inherited @Inherited
注解表示注解类型可以从超类继承。(默认情况下不是这样。)当用户查询注解类型并且该类没有此类型的注解时,将查询类的超类以获取注解类型。此注解仅适用于类声明。
@Repeatable Java SE 8 中引入的 @Repeatable
注解表明标记的注解可以多次应用于同一声明或类型使用。有关更多信息,请参阅 Repeating Annotations。