2013-05-28 122 views
0

只是尋求確認。靜態嵌套類中的方法是隱式靜態的嗎?

public class Indeed{ 
    public static class Inner implements Runnable{ 
     public void run() 
    { 
     System.out.println("Indeed"); 
    } 

    } 
    public static void main (String []args) 
    { 
    Indeed.Inner inner = new Indeed.Inner(); 
    inner.run(); 
    } 
} 

正如你可以在上面的代碼中看到,我可以聲明public void run()未聲明的靜態。我想這是隱含的。不是嗎?

還有一個問題相關:爲什麼我不能使用該方法運行如下:Indeed.Inner.run();它畢竟是靜態的,應該不需要實例化內部成員呢? (我知道我錯了,因爲它不會編譯,如果我這樣做,但我想知道爲什麼)。

在此先感謝。

+1

好像你不知道靜態類是什麼。 –

+0

我想,靜態修飾符不會做你期望的「class」。 – Fildor

+1

[相關問題](http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class) – Supericy

回答

1

靜態類只是一個常規類,實際上比非靜態類更重要。

靜態嵌套類和頂級類之間的區別只是訪問範圍:靜態類可以訪問其封閉類的私有成員。

一旦你清楚了,你就不需要問你在這裏問的問題。

2

不,run()是靜態類Inner的實例方法。一個static(內部)類可以使用沒有封閉父實例的類的實例。當你做Indeed.Inner inner = new Indeed.Inner();時,你正在創建一個靜態類的實例,並且你在這個實例上調用它的run()方法。

4

正如你可以在上面的代碼中看到,我可以聲明公共無效的run()未聲明的靜態。我想這是隱含的。不是嗎?

一個問題相關:爲什麼我不能使用該方法運行如下:Indeed.Inner.run();

因爲它不是靜態的。


static class僅適用於內部類,你可以通過它包圍類爲Indeed.Inner指向一個靜態類。

這與非靜態內部類不同,您需要一個封閉類的實例來創建同一個類的實例。例如:

Indeed.Inner inner = new Indeed().new Inner(); 
0

靜態內部類

public static class Inner implements Runnable 

意味着你可以創建它們的實例,而無需創建外類的實例(Indeed

Indeed.Inner inner = new Indeed.Inner(); 

爲什麼我不能使用如下方法運行:Indeed.Inner.run()?

run方法是通過默認不是靜態。直接調用Indeed.Inner.run(),你需要做run()方法static

+0

'靜態內部類'是一個矛盾的詞彙。 [「內部類是一個嵌套類,不明確或隱式地聲明爲靜態。」](http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1 0.3)。 – EJP

相關問題