我們都習慣了static修飾内部變量或者内部方法,這樣的用法 大家很熟悉了,在這裡就不再累述,這裡主要講述static修飾類。
普通類是不允許聲明為靜态的,隻有内部類才可以。被static修飾的内部類可以直接作為一個普通類來使用,而不需執行個體一個外部類(見如下代碼)
public class OuterClass {
public static class InnerClass{
InnerClass(){
System.out.println("============= static 内部類 InnerClass =============");
}
}
}
現在使用内部類
public class TestStaticClass {
public static void main(String[] args) {
// 不需要new一個OutClass
new OuterClass.InnerClass();
}
}
是不是感覺沒有什麼不同?其實不然,我們不需要先執行個體化外部類,然後通過外部類對象再執行個體化内部類。這樣說可能不是明白。貼代碼先
package inner_class;
public class OuterClass {
public class InnerClass{
InnerClass(){
System.out.println("============= 非static 内部類'InnerClass' =============");
}
}
}
現在使用内部類
public class TestStaticClass {
public static void main(String[] args) {
// OutClass需要先生成一個執行個體
OuterClass oc = new OuterClass();
oc.new InnerClass();
}
}
看到差別了吧。static修飾類的時候隻能是内部類。
static經常與final在一起使用。現在看一下他們用法上的差別。
final | static | |
修飾類 | 該類不可被繼承 | 隻能修飾内部類,該類不需要new,是靜态加載(嵌套頂層類) |
修飾接口 | × | × |
修飾構造函數 | × | × |
修飾語句塊 | × | 虛拟機按聲明順序初始化static成員字段和static語句塊 |
修飾字段屬性 | 表示屬性初始化後不能修改(執行個體常量) | 是類變量,所有執行個體共享該變量值(類變量) |
在定義時或構造函數中指派(每個執行個體擁有一份拷貝) | ||
修飾方法 | 該方法不能被覆寫(隻可繼承) | 是類方法,所有執行個體共享該方法(類方法) |
修飾函數參數 | 參數值不能被函數修改 | × |
修飾函數局部變量 | 局部變量初始化後不能修改(局部常量) | × |
用途 | 1).為了防止方法被覆寫或改寫; | 1).定義全局變量或常量; |
2).提高運作效率,JAVA對final方法調用采用内嵌機制; | 2).定義類方法; |