前言
- 在
Java
中腌且,靜態(tài)Static
關鍵字使用十分常見 - 本文全面 & 詳細解析靜態(tài)
Static
關鍵字软啼,希望你們會喜歡
目錄
1. 定義
一種 表示靜態(tài)屬性的 關鍵字 / 修飾符
2. 作用
共用、共享
能有此作用的原因分析:
- Java中瓦盛,任何變量 / 代碼存儲時洗显,都是 在編譯時 由系統(tǒng)自動分配內(nèi)存
- 在靜態(tài)變量編譯后外潜,所分配的內(nèi)存會一直存在,直到程序退出內(nèi)存才會釋放這個空間
- 類加載時挠唆,
JVM
會把靜態(tài)變量放到 方法區(qū)处窥,被本類 & 本類的所有實例所共用
3. 具體使用
-
Static
靜態(tài)修飾符可應用于:類、代碼塊玄组、方法 & 變量 - 下面滔驾,我將詳細分析
3.1 靜態(tài)類
- 定義
使用Static
關鍵字 修飾、定義 為 靜態(tài)的 內(nèi)部類
即:
- 靜態(tài)類又名為:靜態(tài)內(nèi)部類
- 該類獨立存在俄讹,形式上與外部類有內(nèi)外關系哆致,實際上則沒有,本質(zhì)是為了隱藏自身
- 具體使用 & 相關規(guī)則
/**
* 1. 靜態(tài)類的方法 = 靜態(tài) / 非靜態(tài)
* (靜態(tài)方法可在外層通過靜態(tài)類調(diào)用患膛,而非靜態(tài)方法必須要創(chuàng)建類的對象后才能調(diào)用)
* 2. 只能引用外部類的靜態(tài)變量(static摊阀,即類變量)
* 3. 注:
* a. 默認不持有外部類引用、使用不依賴于外部類(與外層類無綁定):即使無創(chuàng)建外層類的對象踪蹬,它一樣存在
* b. 若一個內(nèi)部類不是被定義成靜態(tài)內(nèi)部類胞此,那么其成員變量 / 方法不能被定義成靜態(tài)
* c. 靜態(tài)內(nèi)部類 & 非靜態(tài)內(nèi)部類在創(chuàng)建時有區(qū)別,下面會詳細說明
*/
// 外部類
public class A {
// 靜態(tài)內(nèi)部類
public static class B{
}
// 非靜態(tài)內(nèi)部類(即 普通)
class C{
}
}
// 靜態(tài)內(nèi)部類b & 非靜態(tài)內(nèi)部類c 創(chuàng)建時的區(qū)別:
A a=new A();
A.B b=new A.B();
A.C c=a.new C();
- 靜態(tài)內(nèi)部類 與 內(nèi)部類的區(qū)別
- 特別注意
a. 加載一個類時跃捣,其內(nèi)部類不會同時被加載豌鹤。
b. 一個類被加載時刻 = 當且僅當其某個靜態(tài)成員被調(diào)用時(靜態(tài)域、構(gòu)造器枝缔、靜態(tài)方法等)
3.2 靜態(tài)代碼塊
- 定義
類加載器加載類的最后1步(類初始化)時,執(zhí)行類構(gòu)造器<clinit>()
里需執(zhí)行的一組語句
額外說明
- 類初始化 = 真正開始執(zhí)行類中定義
Java
程序代碼 = 執(zhí)行類構(gòu)造器<clinit>()
<clinit>()
= 由編譯器自動收集類中所有類變量的賦值動作&靜態(tài)語句塊中的語句合并產(chǎn)生的- 與類構(gòu)造函數(shù)(即實例構(gòu)造器
<init>()
)不同蚊惯,<clinit>()
不需顯式地調(diào)用父類構(gòu)造器愿卸,虛擬機會保證子類的<clinit>()
執(zhí)行前,父類的<clinit>()
已執(zhí)行完畢
- 具體使用 & 相關規(guī)則
/**
* 1. 代碼塊 使用 Static修飾
* 2. 靜態(tài)塊只會在類加載到內(nèi)存中時執(zhí)行1次
* a. 若有多個static代碼塊截型,JVM將按照它們在類中出現(xiàn)的先后順序依次執(zhí)行
* b. 靜態(tài)語句塊中只能訪問定義在靜態(tài)語句塊之前的變量趴荸,定義在它之后的變量可以賦值,但不能訪問宦焦。如下實例所示
*/
public class Test {
// 使用靜態(tài)修飾的靜態(tài)代碼塊
static{
i=0; // 給變量賦值发钝,可通過編譯
System.out.print(i); // 非法, 提示:“非法向前引用”
}
static int i=1;
}
3.3 靜態(tài)方法
- 定義
使用Static
關鍵字 修飾波闹、定義為靜態(tài)的成員方法
也稱:類方法
- 具體使用 & 相關規(guī)則
/**
* 1. 可直接通過類名調(diào)用酝豪,也可通過對象實例調(diào)用
* (屬于類,不屬于實例)
* 2. 任何的實例都可調(diào)用(方便共享精堕、公用)
* 3. 只能訪問所屬類的靜態(tài)成員變量 & 方法孵淘、不能使用this、super關鍵字
* (this = 調(diào)用該函數(shù)的對象歹篓、但由于靜態(tài)方法可以直接使用類名調(diào)用(即可能還沒創(chuàng)建對象)瘫证,所以不可使用this)
*/
// 靜態(tài)方法的申明
public static void a(int param) {
}
3.4 靜態(tài)變量
- 定義
使用Static
關鍵字 修飾揉阎、定義為靜態(tài)的成員變量
也稱:類變量
- 具體使用 & 相關規(guī)則
/**
* 1. 靜態(tài)變量在內(nèi)存中只有1個拷貝:JVM只為靜態(tài)分配1次內(nèi)存
* a. 全部對象共用這個static關鍵字修飾的成員變量,方便對象間共享背捌,節(jié)省內(nèi)存
* b. 未被Static修飾的成員變量 = 實例變量:每創(chuàng)建1個實例毙籽,JVM就會為實例變量分配1次內(nèi)存,實例變量在內(nèi)存中可以有多個拷貝(但互相不影響毡庆,更加靈活)
* 2. 可用類名直接訪問:在加載類的過程中完成靜態(tài)變量的內(nèi)存分配坑赡,(也可通過對象實例訪問)
* (屬于類,不屬于實例)
* 3. 非線程安全:因靜態(tài)變量被類的所有實例共用
* 4. 局部變量也能被聲明為static
*/
// 靜態(tài)方法的申明
public class A {
private static int count = 0; //靜態(tài)變量的申明
}
- 靜態(tài)變量與實例變量的區(qū)別
至此扭仁,關于Java
中的靜態(tài) Static
關鍵字講解完畢垮衷。
4. 總結(jié)
本文主要講解了Java
中的靜態(tài) Static
關鍵字,總結(jié)如下:
歡迎關注Carson_Ho的簡書乖坠!
分享Android技術(shù)干貨搀突,追求短、平熊泵、快仰迁,但卻不缺深度。
請點贊顽分!因為你的鼓勵是我寫作的最大動力徐许!
相關文章閱讀
Android開發(fā):最全面、最易懂的Android屏幕適配解決方案
Android事件分發(fā)機制詳解:史上最全面卒蘸、最易懂
Android開發(fā):史上最全的Android消息推送解決方案
Android開發(fā):最全面雌隅、最易懂的Webview詳解
Android開發(fā):JSON簡介及最全面解析方法!
Android四大組件:Service服務史上最全面解析
Android四大組件:BroadcastReceiver史上最全面解析