2014-01-25 142 views
3

如果我不能創建一個靜態類的實例,爲什麼我可以實例化一個靜態內部類?爲什麼我可以實例化一個靜態內部類?

在代碼波紋管,計數器是一個靜態內部類,但它可以被實例化爲如果不是:

public class Task { 

    static class Counter { 
     int counter = 0; 
     void increment() {counter++;} 
    } 

    public static void main(String[] args) { 
     Counter counter1 = new Task.Counter(); 
     Counter counter2 = new Task.Counter(); 
     counter1.increment(); 
     counter2.increment(); 
     counter2.increment(); 
     counter2.increment(); 
     System.out.println("counter1: " + counter1.counter); 
     System.out.println("counter2: " + counter2.counter); 
    } 
} 

如果計數器不是一個靜態類,它cound是使用以下sintax實例:

Counter counter1 = new Task().new Counter(); 
Counter counter2 = new Task().new Counter(); 

但我無法弄清楚這些方法在實際手段上的區別。

+0

[Java內部類和靜態嵌套類]的可能重複(http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class) – Mark

+0

謝謝,但我不同意,因爲引用的問題解釋了內部類和嵌套類之間的區別。我問爲什麼我可以實例化一個靜態內部類,就好像它不是靜態的。在我看來,這不是一回事。但我尊重你的觀點。 – outlookrperson

+0

與即將調用'thread.yield()'或Thread.yield()' –

回答

4

在代碼波紋管,計數器是一個靜態內部類,但它可以被實例化爲如果不是:

內部類(無論是static或不)可被實例化,只是就像一個普通的班級一樣。創建一個類static只允許您在不創建封閉類的實例的情況下訪問它。就像您在該代碼中所做的一樣:

Counter counter1 = new Task.Counter(); 

在這裏您將創建Counter的實例。但由於Counter是嵌套類(我們稱之爲static inner類),所以我們必須像這樣訪問它。 Task.CounterCounter類的完全限定名(在此處添加包)。事實上,因爲你main方法是僅在Task類,可以直接使用:

Counter counter1 = new Counter(); 

現在,對於inner class(非靜態),你不能訪問類沒有封閉的任何實例類。因此,要創建Counter一個實例,你首先需要的Task一個實例,像這樣:

Task task = new Task(); 
Counter counter = task.new Counter(); 

您可以將這些報表合併成一個像這樣的:

Counter counter = new Task().new Counter(); 

在簡單的話,所不同的是inner class有一個與它關聯的封閉實例的引用,其中nested class沒有這樣的引用。

+0

謝謝,很好的解釋。但內部類和嵌套類不是同義詞? – outlookrperson

+0

@rperson編號'靜態內部類'通常被稱爲'嵌套類'。而'非靜態內部類'只是被稱爲'內部類'。 –

+0

我明白了。這只是一個術語問題。謝謝。 – outlookrperson

0

靜態嵌套類不能訪問它所嵌套類的非靜態字段和方法。 嵌套類的實例中存在非靜態嵌套類('內部類'),因此它可以訪問其非靜態字段和方法。

相關問題