2013-10-17 64 views
4

爲什麼可以將內部類(也稱爲非靜態嵌套的)類定義到接口中?嵌套到接口中的類

它有什麼意義嗎?他們不能含有接口的實例中存在,因爲接口不能被實例化,所以......

以下不編譯:

interface MyInterface 
{ 
    static class StaticNestedClass 
    { 
     static int a() 
     { 
      return 0; 
     } 
     int b() 
     { 
      return 1; 
     } 
    } 
    class InnerClass 
    { 
     static int a() 
     { 
      return 0; 
     } 
     int b() 
     { 
      return 1; 
     } 
    } 
} 

有2個以上的類之間有什麼區別?實際上是否考慮到static? 請注意,如果您將interface更改爲class,您顯然會在InnerClass'static int a()上收到編譯錯誤。

此外,看看下面:

interface MyInterface 
{ 
    int c=0; 
    static class StaticNestedClass 
    { 
     static int a() 
     { 
      return c; 
     } 
     int b() 
     { 
      return c+1; 
     } 
    } 
    class InnerClass 
    { 
     static int a() 
     { 
      return c; 
     } 
     int b() 
     { 
      return c+1; 
     } 
    } 
} 

不同於當包含實體外是一個類,這裏​​當然有作爲「沒有這樣的東西的內部(非靜態嵌套)類可以訪問外部的字段,而靜態嵌套類不能「,因爲考慮到我們的外部thingie是一個接口,我們的c整數是隱式靜態的...... interface的嵌套類也隱式地靜態嗎?

那麼再一次,StaticNestedClassInnerClass只是一樣嗎?

+1

我** **想'類InnerClass'隱含靜態的,在同樣'C' – Cruncher

+1

@Cruncher事實上,接口中的任何非方法都會被編譯器自動標記爲「static」。 –

回答

3
class InnerClass 

被隱式(轉換爲被編譯器按照JLS, Section 9.5

在接口的成員的類型聲明是隱式的靜態和 公衆。允許冗餘地指定這兩個 修飾符中的任何一個或兩個。

static class InnerClass 

,因爲它是一個接口。

更改接口到類時會出錯,因爲不允許使用非靜態內部類,並且在類中不會隱式轉換爲靜態。

直接回答你的最後一個問題,

是,StaticNestedClassInnerClass是一樣的

+2

[The JLS,Section 9.5](http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.5)提到了接口成員隱含的「靜態」,它包括成員類。 – rgettman

+0

@rgettman我正在尋找特定的JLS部分。我遇到了這個問題,並不確定那部分是否涵蓋了內部課程。謝謝,將添加到帖子。編輯:沒關係,我在9.3,9.5是相當明確這個 – Cruncher

+0

謝謝Cruncher和rgettman,JLS 9.5部分正是我所期待的。 –