靜態內部類

轉載自:http://blog.sina.com.cn/s/blog_5da93c8f0100wib7.html

在一個類中創建另外一個類,叫做成員內部類。這個成員內部類可以靜態的(利用static關鍵字修飾),也可以是非靜態的。

 

一、靜態內部類的使用目的。

在 定義內部類的時候,在其前面加上一個權限修飾符static。這個內部類就變爲了靜態內部類。如在進行代碼程序測試的時候,如果在每一個Java源文件中 都設置一個主方法(主方法是某個應用程序的入口,必須具有),那麼會出現很多額外的代碼。而且最主要的時這段主程序的代碼對於Java文件來說,只是一個 形式,其本身並不需要這種主方法。但是少了這個主方法又是萬萬不行的。在這種情況下,就可以將主方法寫入到靜態內部類中,從而不用爲每個Java源文件都設置一個類似的主方法。這對於代碼測試是非常有用的。在一些中大型的應用程序開發中,則是一個常用的技術手段。

 

二、靜態內部類的使用限制。

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

 

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

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

 

二是在成員的引用上,有比較大的限制。一般的非靜態內部類,可以隨意的訪問外部類中的成員變量與成員方法。即使這些成員方法被修飾爲private(私有的成員變量或者方法)。因爲在其他類中是無法訪問被定義爲私有的成員變量或方法。但是如果一個內部類被定義爲靜態的,那麼在引用外部類的成員方法或則成員變量的時候,就會有諸多的限制。如不能夠從靜態內部類的對象中訪問外部類的非靜態成員(包括成員變量與成員方法)。這是什麼意思呢?如果在外部類中定義了兩個變量,一個是非靜態的變量,一個是靜態的變量。靜態內部類只能引用外部類中的靜態的成員(變量或方法),而不能夠訪問非靜態的變量。對於那些非靜態的成員變量與成員方法,在靜態內部類中是無法訪問的。這就是靜態內部類的最大使用限制。在普通的非靜態內部類中是沒有這個限制的。也正是這個原因,決定了靜態內部類只應用在一些特定的場合。其應用範圍遠遠沒有像非靜態的內部類那樣廣泛。

 

三是在創建靜態內部類時不需要將靜態內部類的實例綁定在外部類的實例上。

      通常情況下,在一個類中創建成員內部類的時候,有一個強制性的規定,即內部類的實例一定要綁定在外部類的實例中。也就是說,在創建內部類之前要先在外部類中要利用new關鍵字來創建這個內部類的對象。如此的話如果從外部類中初始化一個內部類對象,那麼內部類對象就會綁定在外部類對象上。也就是說,普通非靜態內部類的對象是依附在外部類對象之中的。通常情況下,程序員在定義靜態內部類的時候,是不需要定義綁定在外部類的實例上的也就是說,要在一個外部類中定義一個靜態的內部類,不需要利用關鍵字new來創建內部類的實例。

 

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

牢記兩個差別:

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

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

 

這兩個差異是靜態內部類與非靜態外部類最大的差異,也是靜態內部類之所以存在的原因。瞭解了這個差異之後,程序開發人員還需要知道,在什麼情況下該使用靜態內部類。如在程序測試的時候,爲了避免在各個Java源文件中書寫主方法的代碼,可以將主方法寫入到靜態內部類中,以減少代碼的書寫量,讓代碼更加的簡潔。

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

 

靜態內部類:

  1. package innerClass;   
  2. public class OutClass1 {   
  3.     public int oid;   
  4.     public String oname;   
  5.     public static class InnerStaticClass1{   
  6.         public int iid;   
  7.         public String iname;   
  8.     }   
  9. }  
  1. package innerClass;   
  2. import innerClass.OutClass1.InnerStaticClass1;   
  3. public class Test1 {   
  4.     public static void main(String[] args) {   
  5.         OutClass1 oc=new OutClass1();   
  6.         InnerStaticClass1 ic=new InnerStaticClass1();   //不依賴與外部類的實例 
  7.     }   
  8. }  

非靜態內部類:

  1. package innerClass;   
  2. public class OutClass2 {   
  3.     public int oid;   
  4.     public String oname;   
  5.     public class InnerClass2   
  6.     {   
  7.         public int iid;   
  8.         public String iname;   
  9.     }   
  10. }   
  1. package innerClass;   
  2. public class Test2 {   
  3.     public static void main(String[] args) {   
  4.         OutClass2 oc=new OutClass2();   
  5.         OutClass2.InnerClass2 ic=oc.new InnerClass2(); //依賴與外部類的實例   
  6.     }   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章