Java 中的注释是应用程序源代码中的一种注释(或文档),用于指示https://www.scientecheasy.com/2021/03 /java-compiler.html/Java 编译器执行某些操作。当 Java 编译器在特定源代码中看到注释时,它知道需要对后 面的代码执行一些特殊操作。我们可以注释Java包、类、接口、构造函数、方法、字段、局部变量和参数。例如,我们可以注释一个要重写的方 法,以告诉 Java 编译器验证我们是否确实重写了该方法,而不是重载它。Java 注释有助于提供一种系统方法,以 Java 编译器 和 JVM 可以理解、测试和验证的功能方式为特定代码添加额外信息。注解是一项极其强大的新功能,首次添加到 Java 5 中。Jav a 提供了一些预定义的注释,但我们也可以轻松创建自定义(用户定义)注释,这些注释可以与我们的应用程序代码一起使用以提供一些特殊功能 。在本教程中,我们将重点介绍 Java 语言提供的预定义注释,在下一个教程中,我们将学习用户定义的注释。Java 注解语法注释的作 用类似于标签,用于为 java 源代码提供元数据。元数据是提供有关其他数据的信息的数据。Java 中的注释始终以 @ 符号开头,并 且必须直接放置在被注释的代码之前。声明注解的一般语法如下:@AnnotationType或者,@AnnotationType(el ementValuePairs)第一种语法用于声明标记注释类型。例如,@Deprecated 是一种标记注释类型。第二种语法用于声 明单值或多值类型。例如:@Person(名字 = "伊万", 姓 = "萨加尔")@阶段(值= 1)@阶段1)Java 中的标准内 置注释(预定义注释)Java 5 包含三个通用的通用标准内置注释,定义在 java.lang.annotation 包中,用于向 Java 编译器发出指令。它们如下:@已弃用@覆盖@SuppressWarnings后来,Java 7和Java 8在java.l ang.annotation包中添加了SafeVarargs和FunctionalInterface注释。让我们通过例子来一一理解 。已弃用的注释@Deprecated 注释是一种标记注释,可用于将类、方法、字段或其他编程功能标记为已弃用,这意味着它不应再使用。 如果您的源代码在程序中使用了不推荐使用的类、方法或字段,Java 编译器将在编译时为您生成一条警告消息。此消息通知程序员它在 JD K 的早期版本中可用,但在未来版本或当前版本中将不再可用。因此,它今天可能有效,但不能保证它会永远有效。当这种情况发生时,我们需要 更新他们的代码并停止使用特定的类、方法、字段或其他编程功能。让我们看一个简单的示例程序,我们将在其中将方法标记为已弃用。程序代码: 公共类DeprecatedTest{公共无效x(){ System.out.println("你好x");}@已弃用 公共无效y( ) { System.out.println("你好,y"); }公共静态无效主(字符串[] args){DeprecatedT est obj = new DeprecatedTest(); obj.x(); obj.y(); }}输出: 你好x 你好,你我 们可以使用@Deprecated注解在顶部标记一个类或接口。下面是一个被标记为已弃用的类的示例。@已弃用公共类Deprecated Class{ 无效 x() { }}@Override注解@Override 注解是一种标记注解,用在方法上方,向 Java 编 译器指示子类方法正在重写超类方法。如果此注释出现在方法上方,并且该方法签名与超类中的方法签名不匹配,则编译器将产生错误,以便我们知 道重写有问题。@Override 注释对于重写超类中的方法不是必需的。如果有人更改了超类中被重写方法的名称,或者犯了拼写错误,那么 子类方法将不再重写它。在这种情况下,如果没有 @Override 注解,我们将无法发现。因此,最好使用 @Override 注解来 标记方法,以向程序员保证该方法已被重写。使用@Override注解,Java编译器会告诉你子类方法不会覆盖超类方法。我们来看一个基 于Java中@Override注解的简单示例程序。程序代码:公共A类{无效 m1() { System.out.println(" A-m1"); }}公共类 B 扩展了 A{ 无效 m1(int a) { System.out.println("B-m1"); }公共静态无效主(字符串[] args){B b = 新 B(); b.m1(20); }}输出: B-m1在此程序中,子类中的 m1() 方法不会覆盖超类中存在的方法,因为它具有不同的方法签名。使用@Override注解,我们可以避免这种错误。让我们看看下 面的代码。程序代码:公共A类{无效 m1() { System.out.println("A-m1"); }}公共类 B 扩展了 A{@覆盖 无效 m1(int a) { System.out.println("B-m1"); }公共静态无效主(字符串[] a rgs){B b = 新 B(); b.m1(20); }}输出: 线程“main”java.lang.Error中出现异常:未解 决的编译问题:类型 B 的方法 m1(int) 必须重写或实现超类型方法这次,Java 编译器将产生编译时错误,您将观察到子类中的 m1() 方法没有覆盖超类中的方法。因此,很明显,每当您想要重写某个方法时,请使用 @Override 注解标记该方法。@Sup press警告注释@SuppressWarnings 注解用于抑制编译器生成的警告。换句话说,该注释用于关闭不适当的编译器警告。例 如,如果方法调用已弃用的方法,或进行不安全的类型转换,编译器可能会生成有关它的警告消息。我们可以通过使用 @SuppressWar nings 注释来注释包含代码的方法来抑制此警告消息。此 @SuppressWarnings 注释可以应用于类型、构造函数、方法、 字段、参数和局部变量。让我们看一个基于 Java @SuppressWarnings 注释的简单示例程序。程序代码:导入java. util.ArrayList;公共类 SupressWarningsTest {@SuppressWarnings({ "未选中 ", "rawtypes" })公共静态无效主(字符串[] args){ArrayList arList = new ArrayL ist(); arList.add("橙色"); arList.add("粉红色"); arList.add("红色"); arL ist.add("绿色"); arList.add("蓝色"); for(对象 obj : arList) {System.ou t.println(obj); } }}输出: 橙子 粉色的 红色的 绿色的 蓝色的您可以注意到编译时没有警告。如果删除 @Sup pressWarnings({ “unchecked”, “rawtypes” }) 注释,它将在编译时显示警告,因为我们使用的是 非泛型集合。@FunctionalInterface注解java中的函数式接口是一种只能声明一个抽象方法的接口。@Function alInterface 是一种标记注释类型,用于验证编译器该接口具有唯一的抽象方法。如果一个接口没有用这个注解来注解就不是函数式接 口,编译器会产生一个编译时错误。它不能与类、注释类型和枚举一起使用。让我们举一个简单的例子,其中接口 Person 使用 @Fun ctionalInterface 注释。@功能接口公共接口人{ 无效播放();// 只有一个抽象方法。}以下 Student 接口 的声明使用了 @FunctionalInterface 注释,该注释将生成编译时错误,因为 Student 接口定义了两个抽象方法 ,因此它不是函数式接口。@功能接口公共接口 学生{ 无效播放(); 无效读取();}注意:如果一个接口只有一个抽象方法,那么无论是 否使用@FunctionalInterface注解,它始终是一个函数式接口。@SafeVarargs 注解当我们将 @SafeVa rargs 注解与方法或构造函数一起使用时,方法或构造函数不会对其 varargs 参数执行潜在不安全或有害的操作。当此注释与方法 或构造函数一起使用时,与可变参数使用相关的未经检查的警告将被抑制。Java 中的标准元注释用于注释注解的注解在java中称为元注解 。换句话说,应用于其他注释的注释称为元注释。有四种类型的元注释可用于注释注释。它们如下:记录在案遗传保留目标可重复本国的所有这四个 元注释都在 java.lang.annotation 包中声明。让我们集中讨论这四个元注释。@记录注释@Documented 是一 种标记元注释,用于注释注释类型的声明。如果使用 @Documented 注释声明注释类型,则 Javadoc 工具将为注释类型的所 有实例生成文档。例如,@Override注解不能与@Documented注解一起注解。如果我们使用 Javadoc 工具为其方法用 @Override 注解的类 Test 生成文档,我们将不会在生成的文档中看到任何 @Override 标记。让我们举一个简单的 例子。在下面的代码中,Test类使用@Override注解来注解toString方法。封装注释程序;公开课测试{ @覆盖 公共字符 串 toString() { 返回“测试”; }}另一方面,@Deprecated 注释类型可以使用 @Documented 注释 进行注释。上述程序源码1中,DeprecatedTest类中的y()方法使用@Deprecated注解。现在,如果我们使用 Jav adoc 工具生成 DeprecatedTest 类的文档,文档中 y() 方法的详细信息也会包含 @Deprecated,如下所 示:y@已弃用公共无效y()@继承注解@Inherited 注解是一种元标记注解,用于继承注解类型的实例。例如,如果我们使用 In herited 元注释来注释一个类,则该注释将被该注释类的任何子类继承。如果我们尝试注释除类声明之外的任何类成员,它不会产生任何效 果。让我们考虑两个注释类型声明:Test1 和 Test2。此处,Test1 未使用 Inherited 元注释进行注释,而 Te st3 则使用 Inherited 元注释进行注释。公共@接口测试1 { int id();}@遗传公共@接口测试2 { int id();}让我们考虑两个类 A 和 B,其中类 B 继承类 A。@测试1(id = 100)@Test2(id = 200)公共 A类{ // 这里是 A 类的代码。}// B 类继承 A 类的 Test2(id = 200) 注解。公共类 B 扩展 A { // 这里是 B 类的代码。}在上面的代码片段中,类 B 继承了类 A 的 @Test2(id = 200) 注解,因为 Test 2 注解类型是使用 Inherited 元注解进行注解的。B 类不继承 @Test1(id = 100) 注释,因为 Test1 注释类型未使用 Inherited 元注释进行注释。@Retation注解@Retation 注解是一种元注解类型,用于指定 Ja va 应如何保留注解类型的实例。它也称为注释类型的保留策略。在 Java 中,注释可以保留在以下三个级别:仅源代码仅类文件(默认) 类文件和运行时(简称运行时)如果注释类型具有“仅源代码”保留策略,则注释类型的实例在编译为类文件时将被 Java 编译器丢弃。如果 保留策略是“仅类文件”,则注释类型的实例将保留在类文件中,但 JVM 在运行时无法读取它们。如果保留策略是“类文件和运行时”,则注 释的实例将保留在类文件中,并且可以在运行时由 JVM 读取。例如,SuppressWarnings 注释类型的声明由 @Reten tion 注释,值为 SOURCE。@Retention(值=来源)公共@interface SuppressWarnings如果 我们不在注释类型上声明保留元注释,则其保留策略默认为仅类文件。这意味着我们将无法在运行时由 JVM 读取这些注释。@Target注 解@Target注解是一种元注解,用于对注解类型进行注解,以指定注解类型可以使用的上下文。它只有一个名为 value 的元素。Ta rget 的值可以是 java.lang.annotation.ElementType 枚举的成员之一:a)?ANNOTATION _TYPE:该注释可用于注释另一个注释类型声明。b)?CONSTRUCTOR:该注释可用于注释构造函数声明。c)?FIELD:注释 可用于注释字段声明和枚举常量。d)?LOCAL_VARIABLE:该注释可用于注释局部变量声明。e)?METHOD:注释可用于注释 方法声明。f)?PACKAGE:该注释可用于注释包声明。g)?PARAMETER:可用于注释参数声明。h)?TYPE:注释可用于注 释注释类型、类、接口和枚举声明。例如,Override注解类型声明使用@Target注解进行注解,这将使@Override注解仅适 用于方法声明。@目标(值=方法)// 在 Target 注释中声明多个值。@Target(值 = {类型、字段、方法、参数、构造函 数、LOCAL_VARIABLE})@Repeatable注解大多数注解只能对类、方法、字段等应用一次。在某些情况下,我们需要多次 应用注解。但在 Java 8 之前,不允许重复一个注解超过一次。为了解决这个问题,Java 8添加了@Repeatable注解。J ava 8版本中添加的@Repeatable注解是元注解类型,用于在必须重复使用的情况下对注解类型进行注解。可重复注释只有一个名为 value 的元素,其类型将是另一种注释类型的类类型。看下面的代码,其中A被@Repeatable(B.class)注解注解,这 意味着它是一个可重复的注解类型,并且它包含的注解类型是B。// 包含 B 作为包含注释类型的可重复注释类型。封装注解程序;导入 j ava.lang.annotation.Repeatable;导入java.lang.annotation.Retention;导 入 java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy .RUNTIME)@Repeatable(B.class)公共@接口A{ 字符串日期();}// 可重复注释类型的包含注释类型。封装注解程序;导入java.lang.annotation.Retention;导入 java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)公共@接口B {一个值();}我们可以使用 A 注解来记录 Test 类的更改历史记录,如下所示:封装注解程序;@A(日期=“28/09/2021”)@A(日期=“08/10/2021”)公开课测试{公共静态无效进程(){ // 代码放在这里。 }}@Native注解@Native 注释是一种元注释,用于注释字段。它是一个标记注释,指示被注释的字段可以从本机代码中引用。希望本教程通过示例涵盖了java 中所有重要的注释类型。我希望您已经了解 Java 注解的基本概念。 |
|