Java:關於Static靜態關鍵字的那些小事
阿新 • • 發佈:2018-12-17
前言
- 在
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的安卓開發筆記