接口内的嵌套类是否隐式静态和最终?

SHA*_*NNA 1 java nested interface

接口内的所有变量都是公共静态和最终变量。

因此,如果我在接口内声明一个嵌套类,它也会变成静态和最终的吗?

Interface I
{
    class c
    {
        static void m(){ }
    }
}
Run Code Online (Sandbox Code Playgroud)

Psh*_*emo 5

让我们一探究竟。让我们创建如下结构:

interface Interface{
    class Foo{}
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以测试:

System.out.println("static: " + Modifier.isStatic(Interface.Foo.class.getModifiers()));
System.out.println("final: " + Modifier.isFinal(Interface.Foo.class.getModifiers()));
Run Code Online (Sandbox Code Playgroud)

打印:

interface Interface{
    class Foo{}
}
Run Code Online (Sandbox Code Playgroud)

所以嵌套类是隐式静态的,但不是最终的。

我们也可以通过添加class Bar extends Foo{}到我们的界面来确认它。final类不能扩展,但由于这样的代码编译良好,这意味着Foo不是最终的。

  • @ShimbuGowda 这是错误的问题。正确的问题是:为什么它应该是最终的?或者更确切地说:是否有任何理由将接口中的所有内部类设置为 final?有必要将内部类设置为静态,因为非静态内部类总是“绑定”到周围类的具体实例。因为你不能实例化接口,非静态内部类没有明确定义的语义,因此接口中的所有内部类都是隐式静态的。虽然没有必要将所有内部类设置为 final。 (4认同)
  • @ShimbuGowda final 在字段上的语义与在 class 上的 final 不同。final 在一个字段上意味着,该字段(一旦分配)不能重新分配。final 在一个类上意味着,这个类不能有任何子类。虽然接口的所有成员都充当常量,但没有理由不允许您对接口的嵌套类进行子类化。 (2认同)

das*_*ght 5

嵌套在接口static内部的类的行为类似于嵌套在类中的类,从某种意义上说,您不需要具有外部类的实例来构造嵌套类的实例。根据Java 语言规范第 8.1.3 节

8.1.3内部类和封闭实例

[...] 接口的成员类是隐式静态的(第 9.5 节),因此永远不会被视为内部类。

但是,这些类不是最终的,除非您明确指定它们。这是有道理的,因为实现接口的类可能需要有机会扩展在接口内定义的嵌套类。