Static靜態關鍵字全面詳解

一、前言

Static關鍵在編程中是比較常見的,具體的使用可能對有些人還不很清楚,接下來我就總結一下該關鍵字的幾種使用方式。

二、Static關鍵字

1. 定義
  • 一種 表示靜態屬性的 關鍵字 / 修飾符
2. 作用
  • 共用、共享

能有此作用的原因分析:

  • Java中,任何變量 / 代碼存儲時,都是 在編譯時 由系統自動分配內存
  • 在靜態變量編譯後,所分配的內存會一直存在,直到程序退出內存纔會釋放這個空間
  • 類加載時,JVM會把靜態變量放到 方法區,被本類 & 本類的所有實例所共用

三、具體使用

  • Static靜態修飾符可應用於:類、代碼塊、方法 & 變量
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();
  • 靜態內部類 與 內部類的區別
    在這裏插入圖片描述
  • 特別注意
  1. 加載一個類時,其內部類不會同時被加載。
  2. 一個類被加載時刻 = 當且僅當其某個靜態成員被調用時(靜態域、構造器、靜態方法等)
2、靜態代碼塊
  • 定義
    類加載器加載類的最後1步(類初始化)時,執行類構造器()裏需執行的一組語句
    額外說明
  • 類初始化 = 真正開始執行類中定義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、靜態方法
  • 定義
    使用 Static關鍵字 修飾、定義爲靜態的成員方法

也稱:類方法

  • 具體使用 & 相關規則
/**
 * 1. 可直接通過類名調用,也可通過對象實例調用
 *    (屬於類,不屬於實例)
 * 2. 任何的實例都可調用(方便共享、公用)
 * 3. 只能訪問所屬類的靜態成員變量 & 方法、不能使用this、super關鍵字
 *   (this = 調用該函數的對象、但由於靜態方法可以直接使用類名調用(即可能還沒創建對象),所以不可使用this)
 */

// 靜態方法的申明
public static void a(int param) {

}
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關鍵字講解完畢。

四、總結

本文主要講解了Java中的靜態 Static關鍵字,總結如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章