2013-07-31 166 views
2

靜態嵌套類和頂級類的初始化之間有區別?我明白,靜態類不需要一個封閉的類實例,但如果有多個靜態嵌套類的實例會發生什麼?就像靜態變量被類實例共享一樣,靜態類的實例也會被共享嗎?靜態類在Java初始化

回答

1

讓我看看我是否正確理解你的問題。

一個類可以聲明嵌套類。

如果一個C1類聲明瞭一個non-static內部類C2,則C2可以訪問所有C1的字段和方法,而不管它們的訪問修飾符如何。實際上,C2被視爲一個字段:無論何時創建C1的新實例,都會加載其聲明。這意味着non-static內部類比static更昂貴,如果不是絕對必要的,應該避免。

如果一個C1類聲明瞭一個static內部類C3,那麼C3在C1的所有實例中共享。它可以訪問C1的所有靜態方法和字段,但不能訪問非靜態方法 - C3根據定義不與C1的特定實例綁定,因此它沒有任何訪問權限。

當你聲明一個靜態內部類時,你並沒有說它的實例。你只是告訴編譯器該類的定義是在封閉類的所有實例中共享的。所以,不,嵌套靜態類的實例不會自動共享。

1

A static嵌套類不需要封閉類的實例(如您所指出的那樣),因此之間沒有任何共享。

如果您有一個static變量,那麼該類的每個實例都將持有對同一個static變量的引用。一個類的變化將改變所有類中的變量。

由於class在運行時是不可變的,所以這個相同的邏輯沒有通過。

static嵌套類的實例與任何其他類的實例實際上是相同的。

如果您有一個指向static嵌套類實例的static變量,則共享實例的唯一方法。在這種情況下,它與任何其他static變量相同。

正如指出the tutorial一個static嵌套類和頂層類之間的唯一真正不同的是,一個static嵌套類可以訪問它private static成員是包類。

+0

嗨,boris,感謝您的輸入「由於一個類在運行時是不可變的,所以這個相同的邏輯不能通過。」任何想法爲什麼這種行爲差異? – hakish

+0

行爲有什麼不同? 'class'是一個'class',一個變量是一個變量。他們完全不同。 –

0

每個類都是Class類型的單例對象。

A 靜態內部類是基本情況。另一個是正常的內部類,它的實例對象也有一個OuterClass.this指針。

因此,任何班級的班級初始化都沒有區別。

0

您聲明爲「靜態類」的嵌套類與另一個頂級類沒有區別,如inner class。將靜態聲明添加到聲明中,可以將它聲明爲與僅作爲其名稱空間的所有者類分離。

package org.stack.question 

public class Top { 

    public static class Nested { 

    } 

} 

要創建嵌套類的一個實例,你只能這樣做

Object instance = new org.stack.question.Top.Nested(); 

從規格:

嵌套類不屬於內部類可以聲明靜態成員 自如,在按照Java編程 語言的通常規則。成員接口(第8.5節)是隱式靜態的,因此它們從不被認爲是內部類。