Carson帶你學(xué)Java:3分鐘帶你全面了解Static靜態(tài)關(guān)鍵字


前言

  • Java中,靜態(tài) Static關(guān)鍵字使用十分常見
  • 本文全面 & 詳細(xì)解析靜態(tài) Static關(guān)鍵字,希望你們會(huì)喜歡

目錄

示意圖

1. 定義

一種 表示靜態(tài)屬性的 關(guān)鍵字 / 修飾符


2. 作用

共用、共享

能有此作用的原因分析:

  1. Java中,任何變量 / 代碼存儲(chǔ)時(shí),都是 在編譯時(shí) 由系統(tǒng)自動(dòng)分配內(nèi)存
  2. 在靜態(tài)變量編譯后,所分配的內(nèi)存會(huì)一直存在,直到程序退出內(nèi)存才會(huì)釋放這個(gè)空間
  3. 類加載時(shí),JVM會(huì)把靜態(tài)變量放到 方法區(qū),被本類 & 本類的所有實(shí)例所共用

3. 具體使用

  • Static靜態(tài)修飾符可應(yīng)用于:類、代碼塊、方法 & 變量
  • 下面,我將詳細(xì)分析

3.1 靜態(tài)類

  • 定義
    使用 Static關(guān)鍵字 修飾、定義 為 靜態(tài)的 內(nèi)部類

即:

  1. 靜態(tài)類又名為:靜態(tài)內(nèi)部類
  2. 該類獨(dú)立存在,形式上與外部類有內(nèi)外關(guān)系,實(shí)際上則沒有,本質(zhì)是為了隱藏自身
  • 具體使用 & 相關(guān)規(guī)則
/**
 * 1. 靜態(tài)類的方法 = 靜態(tài) / 非靜態(tài)
 *    (靜態(tài)方法可在外層通過(guò)靜態(tài)類調(diào)用,而非靜態(tài)方法必須要?jiǎng)?chuàng)建類的對(duì)象后才能調(diào)用)
 * 2. 只能引用外部類的靜態(tài)變量(static,即類變量)
 * 3. 注:
 *       a. 默認(rèn)不持有外部類引用、使用不依賴于外部類(與外層類無(wú)綁定):即使無(wú)創(chuàng)建外層類的對(duì)象,它一樣存在
 *       b. 若一個(gè)內(nèi)部類不是被定義成靜態(tài)內(nèi)部類,那么其成員變量 / 方法不能被定義成靜態(tài)
 *       c. 靜態(tài)內(nèi)部類 & 非靜態(tài)內(nèi)部類在創(chuàng)建時(shí)有區(qū)別,下面會(huì)詳細(xì)說(shuō)明
 */

// 外部類
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)建時(shí)的區(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. 加載一個(gè)類時(shí),其內(nèi)部類不會(huì)同時(shí)被加載。
    b. 一個(gè)類被加載時(shí)刻 = 當(dāng)且僅當(dāng)其某個(gè)靜態(tài)成員被調(diào)用時(shí)(靜態(tài)域、構(gòu)造器、靜態(tài)方法等)

3.2 靜態(tài)代碼塊

  • 定義
    類加載器加載類的最后1步(類初始化)時(shí),執(zhí)行類構(gòu)造器<clinit>()里需執(zhí)行的一組語(yǔ)句

額外說(shuō)明

  1. 類初始化 = 真正開始執(zhí)行類中定義Java程序代碼 = 執(zhí)行類構(gòu)造器<clinit>()
  2. <clinit>() = 由編譯器自動(dòng)收集類中所有類變量的賦值動(dòng)作&靜態(tài)語(yǔ)句塊中的語(yǔ)句合并產(chǎn)生的
  3. 與類構(gòu)造函數(shù)(即實(shí)例構(gòu)造器<init>())不同,<clinit>()不需顯式地調(diào)用父類構(gòu)造器,虛擬機(jī)會(huì)保證子類的<clinit>()執(zhí)行前,父類的<clinit>()已執(zhí)行完畢
  • 具體使用 & 相關(guān)規(guī)則
/**
 * 1. 代碼塊 使用 Static修飾
 * 2. 靜態(tài)塊只會(huì)在類加載到內(nèi)存中時(shí)執(zhí)行1次
 *    a. 若有多個(gè)static代碼塊,JVM將按照它們?cè)陬愔谐霈F(xiàn)的先后順序依次執(zhí)行
 *    b. 靜態(tài)語(yǔ)句塊中只能訪問(wèn)定義在靜態(tài)語(yǔ)句塊之前的變量,定義在它之后的變量可以賦值,但不能訪問(wèn)。如下實(shí)例所示
 */

 public class Test { 

     // 使用靜態(tài)修飾的靜態(tài)代碼塊
     static{ 
         i=0;  // 給變量賦值,可通過(guò)編譯 
         System.out.print(i); // 非法, 提示:“非法向前引用” 
     } 

     static int i=1; 
  
 }

3.3 靜態(tài)方法

  • 定義
    使用 Static關(guān)鍵字 修飾、定義為靜態(tài)的成員方法

也稱:類方法

  • 具體使用 & 相關(guān)規(guī)則
/**
 * 1. 可直接通過(guò)類名調(diào)用,也可通過(guò)對(duì)象實(shí)例調(diào)用
 *    (屬于類,不屬于實(shí)例)
 * 2. 任何的實(shí)例都可調(diào)用(方便共享、公用)
 * 3. 只能訪問(wèn)所屬類的靜態(tài)成員變量 & 方法、不能使用this、super關(guān)鍵字
 *   (this = 調(diào)用該函數(shù)的對(duì)象、但由于靜態(tài)方法可以直接使用類名調(diào)用(即可能還沒創(chuàng)建對(duì)象),所以不可使用this)
 */

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

}

3.4 靜態(tài)變量

  • 定義
    使用 Static關(guān)鍵字 修飾、定義為靜態(tài)的成員變量

也稱:類變量

  • 具體使用 & 相關(guān)規(guī)則
/**
 * 1. 靜態(tài)變量在內(nèi)存中只有1個(gè)拷貝:JVM只為靜態(tài)分配1次內(nèi)存
 *   a. 全部對(duì)象共用這個(gè)static關(guān)鍵字修飾的成員變量,方便對(duì)象間共享,節(jié)省內(nèi)存
 *   b. 未被Static修飾的成員變量 = 實(shí)例變量:每創(chuàng)建1個(gè)實(shí)例,JVM就會(huì)為實(shí)例變量分配1次內(nèi)存,實(shí)例變量在內(nèi)存中可以有多個(gè)拷貝(但互相不影響,更加靈活)
 * 2. 可用類名直接訪問(wèn):在加載類的過(guò)程中完成靜態(tài)變量的內(nèi)存分配,(也可通過(guò)對(duì)象實(shí)例訪問(wèn))
 *  (屬于類,不屬于實(shí)例)
 * 3. 非線程安全:因靜態(tài)變量被類的所有實(shí)例共用
 * 4. 局部變量也能被聲明為static
 */

// 靜態(tài)方法的申明
public class A {  

    private static int count = 0;  //靜態(tài)變量的申明
   
}  
  • 靜態(tài)變量與實(shí)例變量的區(qū)別
示意圖

至此,關(guān)于Java中的靜態(tài) Static關(guān)鍵字講解完畢。


4. 總結(jié)

本文主要講解了Java中的靜態(tài) Static關(guān)鍵字,總結(jié)如下:

示意圖

歡迎關(guān)注Carson_Ho的簡(jiǎn)書!

分享Android技術(shù)干貨,追求短、平、快,但卻不缺深度。


請(qǐng)點(diǎn)贊!因?yàn)槟愕墓膭?lì)是我寫作的最大動(dòng)力!

相關(guān)文章閱讀
Android開發(fā):最全面、最易懂的Android屏幕適配解決方案
Android事件分發(fā)機(jī)制詳解:史上最全面、最易懂
Android開發(fā):史上最全的Android消息推送解決方案
Android開發(fā):最全面、最易懂的Webview詳解
Android開發(fā):JSON簡(jiǎn)介及最全面解析方法!
Android四大組件:Service服務(wù)史上最全面解析
Android四大組件:BroadcastReceiver史上最全面解析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容