通常狀況下是不能夠用static修飾類的。若是必定要用static修飾類的話,一般static修飾的是匿名內部類。程序員
在一個類中建立另一個類,叫作成員內部類。這個成員內部類能夠靜態的(利用static關鍵字修飾),也能夠是非靜態的。因爲靜態的內部類在定義、使用的時候會有種種的限制。因此在實際工做中用到的並很少。測試
在開發過程當中,內部類中使用的最多的仍是非靜態地成員內部類。不過在特定的狀況下,靜態內部類也可以發揮其獨特的做用。
1、靜態內部類的使用目的。
在定義內部類的時候,能夠在其前面加上一個權限修飾符static。此時這個內部類就變爲了靜態內部類。不過因爲種種的緣由,如使用上的限制等等因素(具體的使用限制,筆者在下面的內容中會詳細闡述),在實際工做中用的並非不少。可是並非說其沒有價值。在某些特殊的狀況下,少了這個靜態內部類還真是不行。如在進行代碼程序測試的時候,若是在每個Java源文件中都設置一個主方法(主方法是某個應用程序的入口,必須具備),那麼會出現不少額外的代碼。並且最主要的時這段主程序的代碼對於Java文件來講,只是一個形式,其自己並不須要這種主方法。可是少了這個主方法又是萬萬不行的。在這種狀況下,就能夠將主方法寫入到靜態內部類中,從而不用爲每一個Java源文件都設置一個相似的主方法。這對於代碼測試是很是有用的。在一些中大型的應用程序開發中,則是一個經常使用的技術手段。爲此,這個靜態內部類雖然不怎麼經常使用,可是程序開發人員還必需要掌握它。也許在某個關鍵的時刻,其還能夠發揮巨大的做用也說不定。spa
public class MainInStaticClass {對象
static class Main{開發
static void main() {編譯
//將主方法寫到靜態內部類中,從而沒必要爲每一個源文件都這種一個相似的主方法class
new MainInStaticClass().print();變量
}權限
}引用
public static void main(String[] args){
new MainInStaticClass().print();
}
public void print(){
System.out.println("main in static inner class");
}
}
public class TestMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
// new MainInStaticClass().print();
MainInStaticClass.Main.main();
new MainInStaticClass.Main();
}
}
2、靜態內部類的使用限制。
將某個內部類定義爲靜態類,跟將其餘類定義爲靜態類的方法基本相同,引用規則也基本一致。不過其細節方面仍然有很大的不一樣。具體來講,主要有以下幾個地方要引發各位程序開發人員的注意。
一是靜態成員(包括靜態變量與靜態成員)的定義。通常狀況下,若是一個內部類不是被定義成靜態內部類,那麼在定義成員變量或者成員方法的時候,是不可以被定義成靜態成員變量與靜態成員方法的。也就是說,在非靜態內部類中不能夠聲明靜態成員。如如今在一個student類中定義了一個內部類age,若是沒有將這個類利用static關鍵字修飾,即沒有定義爲靜態類,那麼在這個內部類中若是要利用static關鍵字來修飾某個成員方法或者成員變量是不容許的。在編譯的時候就通不過。故程序開發人員須要注意,只有將某個內部類修飾爲靜態類,而後纔可以在這個類中定義靜態的成員變量與成員方法。這是靜態內部類都有的一個特性。也正是由於這個緣由,有時候少了這個靜態的內部類,不少工做就沒法完成。或者說要繞一個大圈纔可以實現某個用戶的需求。這也是靜態的內部類之因此要存在的一個重要緣由。
後注:通過你們的指正,現聲明:非靜態內部類也能夠定義靜態成員但須要同時有final關鍵詞修飾,靜態方法鑑於沒法用final修飾,仍必須是在靜態內部類 或者非內部類中定義。
二是在成員的引用上,有比較大的限制。通常的非靜態內部類,能夠隨意的訪問外部類中的成員變量與成員方法。即便這些成員方法被修飾爲private(私有的成員變量或者方法),其非靜態內部類均可以隨意的訪問。則是非靜態內部類的特權。由於在其餘類中是沒法訪問被定義爲私有的成員變量或則方法。可是若是一個內部類被定義爲靜態的,那麼在銀用外部類的成員方法或則成員變量的時候,就會有諸多的限制。如不可以從靜態內部類的對象中訪問外部類的非靜態成員(包括成員變量與成員方法)。這是什麼意思呢?若是在外部類中定義了兩個變量,一個是非靜態的變量,一個是靜態的變量。那麼在靜態內部類中,不管在成員方法內部仍是在其餘地方,都只可以引用外部類中的靜態的變量,而不可以訪問非靜態的變量。在靜態內部類中,能夠定義靜態的方法(也只有在靜態的內部類中能夠定義靜態的方法),在靜態方法中引用外部類的成員。可是不管在內部類的什麼地方引用,有一個共同點,即都只可以引用外部類中的靜態成員方法或者成員變量。對於那些非靜態的成員變量與成員方法,在靜態內部類中是沒法訪問的。這就是靜態內部類的最大使用限制。在普通的非靜態內部類中是沒有這個限制的。也正是這個緣由,決定了靜態內部類只應用在一些特定的場合。其應用範圍遠遠沒有像非靜態的內部類那樣普遍。
三是在建立靜態內部類時不須要將靜態內部類的實例綁定在外部類的實例上。
一般狀況下,在一個類中建立成員內部類的時候,有一個強制性的規定,即內部類的實例必定要綁定在外部類的實例中。也就是說,在建立內部類以前要先在外部類中要利用new關鍵字來建立這個內部類的對象。如此的話若是從外部類中初始化一個內部類對象,那麼內部類對象就會綁定在外部類對象上。也就是說,普通非靜態內部類的對象是依附在外部類對象之中的。可是,若是成員開發人員建立的時靜態內部類,那麼這就又另當別論了。一般狀況下,程序員在定義靜態內部類的時候,是不須要定義綁定在外部類的實例上的。也就是說,要在一個外部類中定義一個靜態的內部類,不須要利用關鍵字new來建立內部類的實例。即在建立靜態類內部對象時,不須要其外部類的對象。
new MainInStaticClass.Main();