6

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

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

例子:

public class AnnotationContainer {

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

}
4

2 回答 2

7

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

这在JLS Sec 8.5.1(针对类)中进行了描述:

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

JLS Sec 9.5(用于接口):

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

于 2018-06-13T18:10:18.340 回答
1

为了扩展安迪的正确答案,它们完全相同,因为它们是一种特殊的接口声明,并且“成员接口”无论如何都是隐式静态的:

JLS 10 9.6。注释类型

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

JLS 10 8.5.1。静态成员类型声明

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

JLS 10 9.1.1。界面修饰符

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


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

JLS 10第9章接口

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

于 2018-06-14T07:28:26.253 回答