1. 程式人生 > >Java:關於Static靜態關鍵字的那些小事

Java:關於Static靜態關鍵字的那些小事

前言

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

目錄

示意圖

1. 定義

一種 表示靜態屬性的 關鍵字 / 修飾符

2. 作用

共用、共享

能有此作用的原因分析:

  1. Java中,任何變數 / 程式碼儲存時,都是 在編譯時 由系統自動分配記憶體
  2. 在靜態變數編譯後,所分配的記憶體會一直存在,直到程式退出記憶體才會釋放這個空間
  3. 類載入時,JVM會把靜態變數放到 方法區,被本類 & 本類的所有例項所共用

3. 具體使用

  • Static靜態修飾符可應用於:類、程式碼塊、方法 & 變數
  • 下面,我將詳細分析

3.1 靜態類

  • 定義
    使用 Static關鍵字 修飾、定義 為 靜態的 內部類

即:

  1. 靜態類又名為:靜態內部類
  2. 該類獨立存在,形式上與外部類有內外關係,實際上則沒有,本質是為了隱藏自身
  • 具體使用 & 相關規則
/**
 * 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>()裡需執行的一組語句

額外說明

  1. 類初始化 = 真正開始執行類中定義Java程式程式碼 = 執行類構造器<clinit>()
  2. <clinit>() = 由編譯器自動收集類中所有類變數的賦值動作&靜態語句塊中的語句合併產生的
  3. 與類建構函式(即例項構造器<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關鍵字,總結如下:

示意圖

請幫頂 / 評論點贊 !因為你的鼓勵是我寫作的最大動力!