Java關鍵字-static匯總
1.靜態變數(被static修飾的成員變數)
1-靜態變數
- 運行時,Java虛擬機只為靜態變數分配一次記憶體(載入類的過程中完成靜態變數的記憶體分配)
- 類的內部可以在任何方法內直接訪問靜態變數
- 其他類中可通過類名訪問該類中的靜態變數 Class.staticVal
2-實例變數
- 每創建一個實例,Java虛擬機就會為實例變數分配一次記憶體
- 類的內部,可以在非靜態方法中直接訪問實例變數
- 類內部的靜態方法或其他類中則需要通過類的實例對象進行訪問。 class.val
3-靜態變數在類中的作用
- 靜態變數可被類的所有實例共享。(增加實例之間的交互性)
- 若所有類的實例均包含一個相同的常量屬性,則可將其定義為靜態變數而節省記憶體空間。(圓周率)
2.靜態方法(被static修飾的方法)
靜態方法與實例方法區別
- 靜態方法不需要通過其所屬的類的實例即可調用(Class.method()),因此靜態方法中不能使用this與super關鍵字(其都與類的實例相關),也不可直接訪問所屬類的實例變數和實例方法。但可以訪問所屬類的靜態變數和靜態方法。
- 實例方法中可直接訪問所屬類的靜態變數,靜態方法,實例變數和實例方法。
3.靜態程式碼塊
用法:
靜態程式碼塊指Java類中的static{}程式碼塊,主要用於初始化類,為類的靜態變數賦予初始值(提升程式性能)
static {
a = 33;
message = "Hello World";
}
特點:
- 靜態程式碼塊類似於一個方法,但不可存在於任何方法體中。
- 靜態程式碼塊可置於類中任何地方,類中可以有多個靜態程式碼塊。
- JVM在載入類時執行靜態程式碼塊(將只執行一次的初始化操作置於靜態程式碼塊中)
- 若類中含多個靜態程式碼塊,則JVM按其出現次序依次執行且每個只被執行依次。
- 同靜態方法一樣不可直接訪問類的實例變數和實例方法,需通過類的實例對象來訪問。
注: 將static除去即為非靜態程式碼塊,其僅在創建對象時自動執行的程式碼。創建對象時先執行靜態程式碼塊再執行非靜態程式碼塊。
4.靜態導入
導入方法
- 導入指定類的全部靜態成員變數、方法
import static java.lang.Math.*;
- 導入指定類的單個靜態成員變數、方法
import static java.lang.Math.fieldName|mathodName;
導入後使用靜態成員變數或方法時不需使用Class.method(),可直接使用method()。
5.靜態內部類(static修飾的內部類)
實例程式碼
public class Outer {
static class Inner {
// 靜態內部類
}
}
特點:
- 創建靜態內部類的實例時不需創建外部類的實例
Outter.Inner inner = new Outer.Inner();
- 靜態內部類可以定義靜態成員和實例成員。外部類以外其他類需通過完成類名訪問靜態內部類中靜態成員
int b2 = Outer.Inner.b;
,訪問實例成員需通過靜態內部類的實例來訪問。 - 靜態內部類可以直接訪問外部類的靜態成員,需通過外部類的實例訪問外部類的實例成員。