【问题标题】:What's is the difference between a static and non-static annotation?静态注释和非静态注释有什么区别?
【发布时间】:2018-11-23 09:55:16
【问题描述】:

Java 的内部类可以是静态的或非静态的。非静态内部类与封闭类的实例相关联。

注解是一种 Java 接口,与任何其他类一样,它们可以在类中定义。同样,它们可以声明为静态或非静态。这两种选择有什么区别,在使用代码时它们的使用方式有什么区别,是否有任何场景可以使用其中一种?

例子:

public class AnnotationContainer {

  public static @interface StaticAnnotation {}
  public @interface NonstaticAnnotation {}

}

【问题讨论】:

    标签: java java-annotations


    【解决方案1】:

    完全没有区别。嵌套接口始终是静态的。

    这在JLS Sec 8.5.1(用于类)中有所描述:

    成员接口是隐式静态的(第 9.1.1 节)。允许成员接口的声明冗余地指定静态修饰符。

    JLS Sec 9.5(用于接口):

    接口中的成员类型声明是隐式公共和静态的。允许冗余指定这些修饰符中的一个或两个。

    【讨论】:

      【解决方案2】:

      稍微扩展一下Andy's correct answer,它们完全相同,因为它们是一种特殊的接口声明,并且“成员接口”无论如何都是隐式静态的:

      JLS 10 9.6. Annotation Types:

      注解类型声明指定了一种新的注解类型,一种特殊的接口类型。为了区分注解类型声明和普通接口声明,关键字 interface 前面有一个 at 符号 (@)。

      JLS 10 8.5.1. Static Member Type Declarations :

      成员接口是隐式静态的(第 9.1.1 节)。允许成员接口的声明冗余地指定静态修饰符。

      JLS 10 9.1.1. Interface Modifiers

      修饰符 static 仅适用于成员接口(第 8.5.1 节、第 9.5 节),不适用于顶级接口(第 7.6 节)。


      旁注:有趣的是,这些章节没有使用第 9 章顶部定义的术语“嵌套接口”,但它似乎是“成员接口”的同义词:

      JLS 10 Chapter 9. Interfaces:

      嵌套接口是其声明出现在另一个类或接口的主体中的任何接口。

      【讨论】:

      • 成员接口是一种嵌套接口。从第 8.5 节开始:“成员接口是一个接口,其声明直接包含在另一个类或接口声明中。”
      猜你喜欢
      • 2016-08-29
      • 2011-04-23
      • 2014-07-29
      • 1970-01-01
      • 2020-04-10
      • 2015-09-26
      • 2010-09-25
      • 2013-07-21
      • 2011-07-11
      相关资源
      最近更新 更多