2017-09-21 25 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

您可以在界面中定義一個類。在界面內部,內部類是隱式公共靜態的。 ...接口可能包含成員類型聲明接口中的成員類型聲明是隱式靜態和公共的。

所以我們不能非靜態成員聲明爲靜塊靜態方法靜態類

相關問題