• Tags ,
  •         
  • www.breakyizhan.com
  •    

    注释用于提供有关程序的补充信息。

    • 注释以' @ ' 开头。
    • 注释不会更改已编译程序的操作。
    • 注释有助于将元数据(信息)与程序元素(例如实例变量,构造函数,方法,类等)相关联。
    • 注释不是纯注释,因为它们可以改变编译器处理程序的方式。例如,参见下面的代码。
      /* Java program to demonstrate that annotations are
         not barely comments (This program throws compiler
         error because we have mentioned override, but not
         overridden, we haver overloaded display) */
      class Base
      {
           public void display()
           {
               System.out.println("Base display()");
           }
      }
      class Derived extends Base
      {
           @Override
           public void display(int x)
           {
               System.out.println("Derived display(int )"); 
           }
        
           public static void main(String args[])
           {
               Derived obj = new Derived();
               obj.display();
           }
      }
      

      输出:

      10: error: method does not override or implement
          a method from a supertype

      如果我们删除参数(int x)或删除@override,程序编译正常。

    Java注释的类别

    注释分为3类: -
    1.标记注释:
    唯一的目的是标记声明。这些注释不包含任何成员,也不包含任何数据。因此,它作为注释的存在就足够了。由于标记界面不包含成员,因此只需确定它是否存在就足够了。@Override是Marker Annotation的一个例子。

    示例: -  @TestAnnotation()

    2.单值注释:
    这些注释仅包含一个成员,并允许指定成员值的简写形式。我们只需要在应用注释时指定该成员的值,而不需要指定成员的名称。但是,为了使用此简写,成员的名称必须是值。

    示例: -  @TestAnnotation(“testing”);

    3.完整注释:
    这些注释由多个数据成员/名称,值,对组成。

    示例: -  @TestAnnotation(owner =“Rahul”,value =“Class Geeks”)

     

    Java预定义/标准注释

    Java定义了七个内置注释。

    • 从java.lang.annotation中: @Retention@Documented@Target@Inherited
    • java.lang中包含三个: @Deprecated,@ Override@SuppressWarnings

    @Deprecated Annotation

    • 它是标记注释。它表明声明已过时,已被更新的表单取代。
    • 不推荐使用元素时,应使用Javadoc @deprecated标记
    • @deprecated标记用于文档,@ Deprecated标注用于运行时反射。
    • 当两者一起使用时,@ deprecated标签的优先级高于@Deprecated注释。
    public class DeprecatedTest
    {
        @Deprecated
        public void Display()
        {
            System.out.println("Deprecatedtest display()"); 
        }
     
        public static void main(String args[])
        {
            DeprecatedTest d1 = new DeprecatedTest();
            d1.Display();
        }
    }
    

    输出:

    Deprecatedtest display()

    @Override Annotation
    它是一个只能在方法上使用的标记注释。使用@Override注释的方法必须覆盖超类中的方法。如果没有,将导致编译时错误。它用于确保实际覆盖超类方法,而不是简单地重载。

    例:-

    class Base
    {
         public void Display()
         {
             System.out.println("Base display()");
         }
          
         public static void main(String args[])
         {
             Base t1 = new Derived();
             t1.Display();
         }     
    }
    class Derived extends Base
    {
         @Override
         public void Display()
         {
             System.out.println("Derived display()"); 
         }
    }
    

    输出:

    Derived display()

    @SuppressWarnings
    用于通知编译器禁止指定的编译器警告。要禁止的警告由字符串形式的名称指定。这种类型的注释可以应用于任何类型的声明。

    Java将警告分为两类。它们是:deprecation unchecked。当遗留代码与使用泛型的代码接口时,会生成任何未经检查的警告。

    class DeprecatedTest
    {
        @Deprecated
        public void Display()
        {
            System.out.println("Deprecatedtest display()"); 
        }
    }
     
    public class SuppressWarningTest
    {
        // If we comment below annotation, program generates
        // warning
        @SuppressWarnings({"checked", "deprecation"})
        public static void main(String args[])
        {
            DeprecatedTest d1 = new DeprecatedTest();
            d1.Display();
        }
    }
    

    输出:

    Deprecatedtest display()

    @Documented Annotations
    它是一个标记接口,告诉工具要记录注释。Javadoc注释不包含注释。在代码中使用@Documented注释使Javadoc等工具能够处理它并在生成的文档中包含注释类型信息。

    @Target
    它被设计为仅用作另一个注释的注释。@Target接受一个参数,该参数必须是ElementType枚举中的常量。此参数指定可以应用注释的声明类型。下面显示常量以及它们对应的声明类型。

    目标常数 注释可以应用于
    ANNOTATION_TYPE 另一个注释
    CONSTRUCTOR 构造函数
    FIELD 领域
    LOCAL_VARIABLE 局部变量
    METHOD 方法
    PACKAGE
    PARAMETER 参数
    TYPE 类,接口或枚举

    我们可以在@Target注释中指定这些值中的一个或多个。要指定多个值,我们必须在以大括号分隔的列表中指定它们。例如,要指定注释仅适用于字段和局部变量,可以使用此@Target注释:@Target({ElementType.FIELD,ElementType.LOCAL_VARIABLE})@Retention Annotation它确定注释的位置和持续时间。@Retention注释可以具有的3个值:

    • SOURCE:注释将保留在源级别,并由编译器忽略。
    • CLASS:注释将在编译时保留,并由JVM忽略。
    • RUNTIME:这些将在运行时保留。

    @Inherited
    @Inherited是一个标记注释,只能用于注释声明。它仅影响将在类声明上使用的注释。@Inherited使超类的注释被子类继承。因此,当对子类进行特定注释的请求时,如果子类中不存在该注释,则检查其超类。如果该批注存在于超类中,并且如果使用@Inherited进行批注,则将返回该批注。

     

    Java用户定义/自定义注释

    用户定义的注释可用于注释程序元素,即变量,构造函数,方法等。这些注释可以在声明元素(构造函数,方法,类等)之前应用。

    语法: -

    [Access Specifier] @interface<AnnotationName>
    {         
       DataType <Method Name>() [default value];
    }
    • AnnotationName是一个标识符。
    • 参数不应与方法声明相关联,并且throws子句不应与方法声明一起使用。
    • 参数不具有空值,但可以具有默认值。
    • 默认值是可选的。
    • 方法的返回类型应该是primitive,enum,string,class name或primitive,enum,string或class name类型的数组。
    package source;
    // A Java program to demonstrate user defined annotations
    import java.lang.annotation.Documented;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
     
    // user-defined annotation
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @ interface TestAnnotation
    {
        String Developer() default "Rahul"; 
        String Expirydate();
    } // will be retained at runtime
     
    // Driver class that uses @TestAnnotation
    public class Test
    {
        @TestAnnotation(Developer="Rahul", Expirydate="01-10-2020") 
        void fun1()
        {
            System.out.println("Test method 1");
        }
     
        @TestAnnotation(Developer="Anil", Expirydate="01-10-2021")
        void fun2()
        {
            System.out.println("Test method 2");
        }
         
        public static void main(String args[])
        {
            System.out.println("Hello");
        }
    }
    

    输出:

    Hello

     
    转载请保留页面地址:https://www.breakyizhan.com/java/6490.html