Java批注是我们程序源代码的元数据(有关数据的数据)。
它们向编译器提供了有关程序的其他信息,但不属于程序本身。这些注释不影响已编译程序的执行。
注释以@
开头。其语法为:
@AnnotationName
让我们以@Override
注释为例。
@Override
批注指定已被该批注标记的方法以相同的方法名称,返回类型和参数列表覆盖超类的方法。
重写方法时,并非必须使用@Override
。但是,如果使用它,则在覆盖方法时,如果出现错误(例如错误的参数类型),则编译器将给出错误。
示例1:@Override注释示例
class Animal {
public void displayInfo() {
System.out.println("I am an animal.");
}
}
class Dog extends Animal {
@Override
public void displayInfo() {
System.out.println("I am a dog.");
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.displayInfo();
}
}
输出
I am a dog.
在此示例中,方法displayInfo()
同时存在于超类Animal和子类Dog中 。调用此方法时,将调用子类的方法,而不是超类中的方法。
注释格式
注释也可以包括元素(成员/属性/参数)。
1.标记注释
标记注释不包含成员/元素。它仅用于标记声明。
其语法为:
@AnnotationName()
由于这些注释不包含元素,因此可以排除括号。例如,
@Override
2.单元素注释
单个元素注释仅包含一个元素。
其语法为:
@AnnotationName(elementName = "elementValue")
如果只有一个元素,则习惯上将该元素命名为value 。
@AnnotationName(value = "elementValue")
在这种情况下,也可以排除元素名称。元素名称默认为值 。
@AnnotationName("elementValue")
3.多元素注释
这些注释包含多个用逗号分隔的元素。
其语法为:
@AnnotationName(element1 = "value1", element2 = "value2")
注解位置
通过将任何声明放在该声明之上,可以将其标记为带有注释。从Java 8开始,注释也可以放在类型之前。
1.以上声明
如上所述,Java注释可以放在类,方法,接口,字段和其他程序元素声明的上方。
示例2:@SuppressWarnings注释示例
import java.util.*;
class Main {
@SuppressWarnings("unchecked")
static void wordsList() {
ArrayList wordList = new ArrayList<>();
// This causes an unchecked warning
wordList.add("programiz");
System.out.println("Word list => " + wordList);
}
public static void main(String args[]) {
wordsList();
}
}
输出
Word list => [programiz]
如果在不使用@SuppressWarnings("unchecked")
批注的情况下编译上述程序,则编译器仍将编译该程序,但会给出如下警告:
Main.java uses unchecked or unsafe operations.
Word list => [programiz]
我们收到警告
Main.java uses unchecked or unsafe operations
由于以下陈述。
ArrayList wordList = new ArrayList<>();
这是因为我们尚未定义数组列表的通用类型。我们可以通过在尖括号<>
指定泛型来解决此警告。
ArrayList wordList = new ArrayList<>();
2.类型注释
在Java 8之前,注释只能应用于声明。现在,也可以使用类型注释。这意味着我们可以在使用类型的任何地方放置注释。
构造函数调用
new @Readonly ArrayList<>()
类型定义
@NonNull String str;
该声明指定String
类型的非null变量str ,以避免NullPointerException
。
@NonNull List newList;
该声明指定String
类型的非空列表。
List newList;
该声明指定String
类型的非空值的列表。
类型转换
newStr = (@NonNull String) str;
扩展和实施条款
class Warning extends @Localized Message
引发子句
public String readMethod() throws @Localized IOException
类型注释使Java代码可以得到更好的分析,并提供更强大的类型检查。
注释类型
1. 预定义的注释
-
@Deprecated
-
@Override
-
@SuppressWarnings
-
@SafeVarargs
-
@FunctionalInterface
2. 元注释
-
@Retention
-
@Documented
-
@Target
-
@Inherited
-
@Repeatable
3. 自定义注释
这些注释类型在Java Annotation Types教程中有详细描述。
注释的使用
- 编译器指令 -批注可用于向编译器提供指令,检测错误或禁止警告。内置注释
@Override
@Deprecated
,@Override
@SuppressWarnings
用于这些目的。 - 编译时指令 -这些批注提供的编译时指令可帮助软件构建工具生成代码,XML文件等。
- 运行时指令 -可以定义一些注释以在运行时向程序提供指令。这些批注是使用Java Reflection访问的。