我們都習慣了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).定義類方法; |