Java:3分鐘帶你全面瞭解Static靜態關鍵字

前言
- 在
Java
中,靜態Static
關鍵字使用十分常見 - 本文全面 & 詳細解析靜態
Static
關鍵字,希望你們會喜歡
目錄

示意圖
1. 定義
一種 表示 靜態屬性 的 關鍵字 / 修飾符
2. 作用
共用、共享
能有此作用的原因分析:
- Java中,任何變數 / 程式碼儲存時,都是 在編譯時 由系統自動分配記憶體
- 在靜態變數編譯後,所分配的記憶體會一直存在,直到程式退出記憶體才會釋放這個空間
- 類載入時,
JVM
會把靜態變數放到 方法區 ,被本類 & 本類的所有例項所共用
3. 具體使用
Static
3.1 靜態類
-
定義
使用
Static
關鍵字 修飾、定義 為 靜態的 內部類
即:
- 靜態類又名為:靜態內部類
- 該類獨立存在,形式上與外部類有內外關係,實際上則沒有,本質是為了隱藏自身
- 具體使用 & 相關規則
/** * 1. 靜態類的方法 = 靜態 / 非靜態 *(靜態方法可在外層通過靜態類呼叫,而非靜態方法必須要建立類的物件後才能呼叫) * 2. 只能引用外部類的靜態變數(static,即類變數) * 3. 注: *a. 預設不持有外部類引用、使用不依賴於外部類(與外層類無繫結):即使無建立外層類的物件,它一樣存在 *b. 若一個內部類不是被定義成靜態內部類,那麼其成員變數 / 方法不能被定義成靜態 *c. 靜態內部類 & 非靜態內部類在建立時有區別,下面會詳細說明 */ // 外部類 public class A { // 靜態內部類 public static class B{ } // 非靜態內部類(即 普通) class C{ } } // 靜態內部類b & 非靜態內部類c 建立時的區別: A a=new A(); A.B b=new A.B(); A.C c=a.new C();
- 靜態內部類 與 內部類的區別

示意圖
-
特別注意
a. 載入一個類時,其內部類不會同時被載入。
b. 一個類被載入時刻 = 當且僅當其某個靜態成員被呼叫時(靜態域、構造器、靜態方法等)
3.2 靜態程式碼塊
-
定義
類載入器載入類的最後1步(類初始化)時,執行類構造器
<clinit>()
裡需執行的一組語句
額外說明
- 類初始化 = 真正開始執行類中定義
Java
程式程式碼 = 執行類構造器<clinit>()
-
<clinit>()
= 由編譯器自動收集類中所有類變數的賦值動作&靜態語句塊中的語句合併產生的 - 與類建構函式(即例項構造器
<init>()
)不同,<clinit>()
不需顯式地呼叫父類構造器,虛擬機器會保證子類的<clinit>()
執行前,父類的<clinit>()
已執行完畢
- 具體使用 & 相關規則
/** * 1. 程式碼塊 使用 Static修飾 * 2. 靜態塊只會在類載入到記憶體中時執行1次 *a. 若有多個static程式碼塊,JVM將按照它們在類中出現的先後順序依次執行 *b. 靜態語句塊中只能訪問定義在靜態語句塊之前的變數,定義在它之後的變數可以賦值,但不能訪問。如下例項所示 */ public class Test { // 使用靜態修飾的靜態程式碼塊 static{ i=0;// 給變數賦值,可通過編譯 System.out.print(i); // 非法, 提示:“非法向前引用” } static int i=1; }
3.3 靜態方法
-
定義
使用
Static
關鍵字 修飾、定義為靜態的成員方法
也稱:類方法
- 具體使用 & 相關規則
/** * 1. 可直接通過類名呼叫,也可通過物件例項呼叫 *(屬於類,不屬於例項) * 2. 任何的例項都可呼叫(方便共享、公用) * 3. 只能訪問所屬類的靜態成員變數 & 方法、不能使用this、super關鍵字 *(this = 呼叫該函式的物件、但由於靜態方法可以直接使用類名呼叫(即可能還沒建立物件),所以不可使用this) */ // 靜態方法的申明 public static void a(int param) { }
3.4 靜態變數
-
定義
使用
Static
關鍵字 修飾、定義為靜態的成員變數
也稱:類變數
- 具體使用 & 相關規則
/** * 1. 靜態變數在記憶體中只有1個拷貝:JVM只為靜態分配1次記憶體 *a. 全部物件共用這個static關鍵字修飾的成員變數,方便物件間共享,節省記憶體 *b. 未被Static修飾的成員變數 = 例項變數:每建立1個例項,JVM就會為例項變數分配1次記憶體,例項變數在記憶體中可以有多個拷貝(但互相不影響,更加靈活) * 2. 可用類名直接訪問:在載入類的過程中完成靜態變數的記憶體分配,(也可通過物件例項訪問) *(屬於類,不屬於例項) * 3. 非執行緒安全:因靜態變數被類的所有例項共用 * 4. 區域性變數也能被宣告為static */ // 靜態方法的申明 public class A { private static int count = 0;//靜態變數的申明 }
- 靜態變數與例項變數的區別

示意圖
至此,關於 Java
中的靜態 Static
關鍵字講解完畢。
4. 總結
- 本文主要講解了
Java
中的靜態Static
關鍵字,總結如下:

示意圖
- 下面我將繼續對
Android & Java
中的知識進行深入講解 ,有興趣可以繼續關注 Carson_Ho的安卓開發筆記