1. 程式人生 > >JavaSE_Java中的 靜態內部類 與 內部類

JavaSE_Java中的 靜態內部類 與 內部類

     最近博主在閱讀Java 中HashMap 的時候遇到了靜態內部類,由於平時專案中靜態內部類使用較少,

除此之外,實際工程中,我還在內部類形式的單例模式使用過靜態內部類, 

傳送門: 

對這個知識點進行一下總結,加深認識。

下面講解下靜態內部類與內部類的區別:

靜態內部類的使用限制

       將某個內部類定義為靜態類,跟將其他類定義為靜態類的方法基本相同,引用規則也基本一致。不過其細節方面仍然有很大的不同。具體來說,主要有如下幾個地方要引起各位程式開發人員的注意。

一: 是靜態成員(包括靜態變數與靜態成員)的定義。

      在非靜態內部類中不可以宣告靜態成員。

如現在在一個student類中定義了一個內部類age,如果沒有將這個類利用static關鍵字修飾,即沒有定義為靜態類,那麼在這個內部類中如果要利用static關鍵字來修飾某個成員方法或者成員變數是不允許的。在編譯的時候就通不過。故程式開發人員需要注意,只有靜態內部類才能夠定義靜態的成員變數與成員方法。

示例程式碼 :

二: 是在成員的引用上,有比較大的限制。

   一般的非靜態內部類可以隨意的訪問外部類中的成員變數與成員方法。即使這些成員方法被修飾為private(私有的成員變數或者方法)。因為在其他類中是無法訪問被定義為私有的成員變數或方法。

   但是如果一個內部類被定義為靜態的

,那麼在引用外部類的成員方法或則成員變數的時候,就會有諸多的限制。不能夠從靜態內部類的物件中訪問外部類的非靜態成員(包括成員變數與成員方法)。這是什麼意思呢?如果在外部類中定義了兩個變數,一個是非靜態的變數,一個是靜態的變數。靜態內部類只能引用外部類中的靜態的成員(變數或方法),而不能夠訪問非靜態的變數。對於那些非靜態的成員變數與成員方法,在靜態內部類中是無法訪問的。這就是靜態內部類的最大使用限制。在普通的非靜態內部類中是沒有這個限制的。也正是這個原因,決定了靜態內部類只應用在一些特定的場合。其應用範圍遠遠沒有像非靜態的內部類那樣廣泛。

示例程式碼:

三: 是在建立靜態內部類時不需要將靜態內部類的例項繫結在外部類的例項上。

注意 : 該處為靜態內部類的一個優勢,也就是HashMap中 Node, TreeNode 定義為靜態內部類的原因。

   通常情況下,在一個類中建立成員內部類的時候,有一個強制性的規定,即內部類的例項一定要繫結在外部類的例項中。也就是說,在建立內部類之前要先在外部類中要利用new關鍵字來建立這個內部類的物件。如此的話如果從外部類中初始化一個內部類物件,那麼內部類物件就會繫結在外部類物件上。

    也就是說,普通非靜態內部類的物件是依附在外部類物件之中的。通常情況下,程式設計師在定義靜態內部類的時候,是不需要定義繫結在外部類的例項上的。也就是說,要在一個外部類中定義一個靜態的內部類,不需要利用關鍵字new來建立內部類的例項。

示例程式碼:

牢記兩個差別:

一、如是否可以建立靜態的成員方法與成員變數(靜態內部類可以建立靜態的成員,而非靜態的內部類不可以)

二、對於訪問外部類的成員的限制(靜態內部類只可以訪問外部類中的靜態成員變數與成員方法,而非靜態的內部類即可以訪問所有的外部類成員方法與成員變數)。

總結 :

       從以上的分析中可以看出,靜態內部類與非靜態的內部類還是有很大的不同的。一般程式開發人員可以這麼理解,非靜態的內部類物件隱式地在外部類中儲存了一個引用,指向建立它的外部類物件。

   靜態內部類在Java語言中是一個很特殊的類,跟普通的靜態類以及非靜態的內部類都有很大的差異。作為程式開發人員,必須要知道他們之間的差異,並在 實際工作中在合適的地方採用合適的類。不過總的來說,靜態內部類的使用頻率並不是很高。但是在有一些場合,如果沒有這個內部靜態類的話,可能會起到事倍功半的反面效果.