2017-09-21 26 views
1

按JLS:内部类允许静态字段和非常量静态表达式 - 为什么?

内部类是一个嵌套类,它是不明确或隐含 声明为static。内部类可能不会声明静态初始化程序 或成员接口。

但我的下面的代码编译成功。

class A { 
    interface B { 
     class C { // Inner class having static variables. 
      static int d; // Static variable 
      static { 
      } 
     } 
    } 
} 

有一个人帮助我理解这种行为

+2

我很确定'C'隐式地是'static',而不是一个内部类。 –

+0

您的嵌套类**被隐式声明为静态。因为接口不能有内部类。接口B是相同的,这是隐式静态的。 –

回答

4

实测值JLS规格为相同:

8.5.2 - “会员接口总是静态”

9.5 - “接口可能包含构件类型声明(第8.5节)的成员类型声明在一个接口是隐式的静态和 公共”

这意味着上面的代码是道德上等价于(隐式改性剂都写在大写字母):

class A { 
    STATIC interface B { 
     PUBLIC STATIC class C { //It's a static class - that's why static members are legal (like a toplevel class but nested) 
      static int d; //Static variable 
      static {} //Static initializer 

     } 
    } 
} 
2

嵌套接口是隐式静态的,没有一个非静态情况下自己,这就是为什么C是隐式静态的。

1

您可以在界面中定义一个类。在界面内部,内部类是隐式公共静态的。 ...接口可能包含成员类型声明接口中的成员类型声明是隐式静态和公共的。

所以我们不能非静态成员声明为静块静态方法静态类

相关问题