2017-04-21 62 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),所以從不認爲是一種內類。

但是,這些類不是最終的,除非您明確指定它們。這是有道理的,因爲實現接口的類可能需要擴展接口內定義的嵌套類的機會。

相關問題