2017-04-21 106 views
0

接口中的所有变量都是公共静态的和最终的。在接口中嵌套的类是隐式静态还是最终的?

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

Interface I 
{ 
    class c 
    { 
     static void m(){ } 
    } 
} 
+0

我在问接口内部的类是静态的吗? – SHAMBANNA

+0

为什么它不是最后的 – SHAMBANNA

+0

如果它是内在的,它就是静态的。你的意思是'嵌套'类。 – EJP

回答

4

让我们来了解一下。让我们创建结构,如:

interface Interface{ 
    class Foo{} 
} 

现在我们可以测试:

System.out.println("static: " + Modifier.isStatic(Interface.Foo.class.getModifiers())); 
System.out.println("final: " + Modifier.isFinal(Interface.Foo.class.getModifiers())); 

它打印:

static: true 
final: false 

所以嵌套类默认静态的,但不是最终的。

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

+1

值得注意的是,Foo *可能会被最终确定下来,但它需要这样做*显式*,就像任何最终的类一样。 – Michael

+0

感谢您的回答。但为什么它不是最终的? – SHAMBANNA

+4

@ShimbuGowda这是错误的问题。正确的问题是:为什么它应该是最终的?或者说:是否有任何理由在接口final中设置所有内部类?有必要设置内部类的静态,因为非静态内部类总是“绑定”到周围类的具体实例。因为你不能实例化接口,所以非静态的内部类没有明确定义的语义,因此接口中的所有内部类都是隐式静态的。尽管如此,没有必要设置所有内部类。 – Turing85

3

嵌套在接口内部的类的行为类似于嵌套在类内部的类,因为您不需要拥有外部类的实例来构造嵌套类的实例。根据Java Language Specification, §8.1.3

8.1.3 内部类和实例围

[...]甲构件类的接口的是隐式静态的(§9.5),所以从不认为是一种内类。

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