溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解Java代碼塊

發(fā)布時間:2021-11-20 17:13:40 來源:億速云 閱讀:131 作者:柒染 欄目:大數(shù)據(jù)

如何理解Java代碼塊,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

靜態(tài)代碼塊

首先我們來回顧一下static關(guān)鍵字,static關(guān)鍵字可以修飾類和類的成員還有構(gòu)造函數(shù),特點就是在類創(chuàng)建對象前加載并且是所有對象共享的資源,比如靜態(tài)方法可以直接類名打點調(diào)用,不需要使用new關(guān)鍵字來創(chuàng)建對象。
關(guān)于靜態(tài)方法和非靜態(tài)方法的比較
靜態(tài)方法:
  1. 靜態(tài)方法只可以調(diào)用靜態(tài)成員不可以調(diào)用非靜態(tài)成員

  2. 沒有this對象

非靜態(tài)方法:
  1. 非靜態(tài)方法既可以調(diào)用非靜態(tài)成員也可以調(diào)用靜態(tài)成員

靜態(tài)代碼塊作用域:在類的內(nèi)部方法外,使用static修飾

public class CodeBlock {    static{        System.out.println("這是靜態(tài)代碼塊");    }}

什么時候執(zhí)行: 靜態(tài)代碼塊在類被加載的時候就運行了,而且只運行一次,并且優(yōu)先于各種代碼塊以及構(gòu)造函數(shù)。如果一個類中有多個靜態(tài)代碼塊,會按照書寫順序依次執(zhí)行

關(guān)于靜態(tài)代碼塊的問題:
  1. 靜態(tài)代碼塊是否可以訪問方法?這個問題需要從上面的靜態(tài)方法來解答,靜態(tài)代碼塊是可以調(diào)用靜態(tài)方法,但是無法調(diào)用非靜態(tài)方法

  2. 靜態(tài)代碼塊是否可以放在方法體?這個是不可以的,即使是靜態(tài)方法也是不可以放靜態(tài)代碼塊的,且靜態(tài)代碼塊是只能放在類內(nèi)部,無法放在靜態(tài)方法內(nèi)部,因為靜態(tài)塊是加載類的時候就執(zhí)行,而靜態(tài)方法是需要調(diào)用才執(zhí)行,這里是有沖突的。

局部代碼塊

作用域:存在方法中

public static void main (String[] args){    {        int number = 1;    }    System.out.println(number);//異常}

 局部代碼塊執(zhí)行順序是和普通語句一樣,只不過區(qū)分的是在代碼塊中的變量無法在代碼塊外部調(diào)用,如上所示,輸出number時異常,這樣有效的控制變量的生命周期,及早釋放提高內(nèi)存使用率。

構(gòu)造代碼塊

構(gòu)造代碼塊作用域:在類的內(nèi)部且在方法外,與靜態(tài)代碼塊的區(qū)別在于沒有static修飾,且在類創(chuàng)建對象時執(zhí)行
public class CodeBlock {    {        System.out.println("這是構(gòu)造代碼塊");    }}
構(gòu)造代碼塊是在創(chuàng)建類的對象才執(zhí)行,每次創(chuàng)建該類的實例就會執(zhí)行一次,如有多個構(gòu)造代碼塊,執(zhí)行順序為從上至下。 

同部代碼塊

同步代碼塊作用域:在方法內(nèi)部,用synchronized修飾的代碼塊 

public class CodeBlock {    public void syncMethod(Object obj){        synchronized  (obj){
       }    }}

synchronized實質(zhì)上是一個鎖,為什么需要用鎖?當(dāng)有多條線程同時訪問共享數(shù)據(jù)時,會發(fā)生資源搶占,如果不進(jìn)行處理那么有可能會出現(xiàn)每個線程獲取到的數(shù)據(jù)都是不正確的,這里我們可以使用同步方法或者同步代碼塊,當(dāng)一個線程進(jìn)來時,我們需要把其他線程擋在外面,直到這個線程使用完后才讓其他線程使用該資源。

代碼塊執(zhí)行順序
public class CodeBlock {    static{        System.out.println("靜態(tài)代碼塊");    }    {        System.out.println("構(gòu)造代碼塊");    }    public CodeBlock(){        System.out.println("無參構(gòu)造函數(shù)");    }
   public void sayHello(){        {            System.out.println("局部代碼塊");        }    }
   public static void main(String[] args) {        System.out.println("執(zhí)行了main方法");
       new CodeBlock().sayHello();;    }}
執(zhí)行結(jié)果
靜態(tài)代碼塊執(zhí)行了main方法構(gòu)造代碼塊無參構(gòu)造函數(shù)局部代碼塊
執(zhí)行順序為:靜態(tài)代碼塊-->構(gòu)造代碼塊-->構(gòu)造函數(shù)-->局部代碼塊(跟同步代碼塊是同一級別)
關(guān)于父子類的代碼塊執(zhí)行順序,這里就不多花時間了,執(zhí)行順序父類的執(zhí)行在子類之前執(zhí)行,除非是重寫父類的方法。

關(guān)于如何理解Java代碼塊問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI