Java關鍵字-static匯總

1.靜態變數(被static修飾的成員變數)

1-靜態變數

  1. 運行時,Java虛擬機只為靜態變數分配一次記憶體(載入類的過程中完成靜態變數的記憶體分配)
  2. 類的內部可以在任何方法內直接訪問靜態變數
  3. 其他類中可通過類名訪問該類中的靜態變數 Class.staticVal

2-實例變數

  1. 每創建一個實例,Java虛擬機就會為實例變數分配一次記憶體
  2. 類的內部,可以在非靜態方法中直接訪問實例變數
  3. 類內部的靜態方法其他類中則需要通過類的實例對象進行訪問。 class.val

3-靜態變數在類中的作用

  1. 靜態變數可被類的所有實例共享。(增加實例之間的交互性)
  2. 若所有類的實例均包含一個相同的常量屬性,則可將其定義為靜態變數而節省記憶體空間。(圓周率)

2.靜態方法(被static修飾的方法)

靜態方法與實例方法區別
  1. 靜態方法不需要通過其所屬的類的實例即可調用(Class.method()),因此靜態方法中不能使用this與super關鍵字(其都與類的實例相關),也不可直接訪問所屬類的實例變數和實例方法。但可以訪問所屬類的靜態變數和靜態方法。
  2. 實例方法中可直接訪問所屬類的靜態變數,靜態方法,實例變數和實例方法。

3.靜態程式碼塊

用法:

靜態程式碼塊指Java類中的static{}程式碼塊,主要用於初始化類,為類的靜態變數賦予初始值(提升程式性能)

static {
    a = 33;
    message = "Hello World";
}
特點:
  1. 靜態程式碼塊類似於一個方法,但不可存在於任何方法體中。
  2. 靜態程式碼塊可置於類中任何地方,類中可以有多個靜態程式碼塊。
  3. JVM在載入類時執行靜態程式碼塊(將只執行一次的初始化操作置於靜態程式碼塊中)
  4. 若類中含多個靜態程式碼塊,則JVM按其出現次序依次執行且每個只被執行依次。
  5. 同靜態方法一樣不可直接訪問類的實例變數和實例方法,需通過類的實例對象來訪問。

注: 將static除去即為非靜態程式碼塊,其僅在創建對象時自動執行的程式碼。創建對象時先執行靜態程式碼塊再執行非靜態程式碼塊。

4.靜態導入

導入方法
  1. 導入指定類的全部靜態成員變數、方法
    import static java.lang.Math.*;
  2. 導入指定類的單個靜態成員變數、方法
    import static java.lang.Math.fieldName|mathodName;

導入後使用靜態成員變數或方法時不需使用Class.method(),可直接使用method()。

5.靜態內部類(static修飾的內部類)

實例程式碼
public class Outer {
    static class Inner {
        // 靜態內部類
    }
}
特點:
  1. 創建靜態內部類的實例時不需創建外部類的實例
    Outter.Inner inner = new Outer.Inner();
  2. 靜態內部類可以定義靜態成員和實例成員。外部類以外其他類需通過完成類名訪問靜態內部類中靜態成員int b2 = Outer.Inner.b;,訪問實例成員需通過靜態內部類的實例來訪問。
  3. 靜態內部類可以直接訪問外部類的靜態成員,需通過外部類的實例訪問外部類的實例成員。

不積跬步,無以至千里.不積小流,無以成江海。