0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造函數(shù)及普通代碼塊的執(zhí)行順序

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-09 15:40 ? 次閱讀

Java中,靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造函數(shù)、普通代碼塊的執(zhí)行順序是一個(gè)筆試的考點(diǎn),通過(guò)這篇文章希望大家能徹底了解它們之間的執(zhí)行順序。

1、靜態(tài)代碼塊

①、格式 在java類中(方法中不能存在靜態(tài)代碼塊)使用static關(guān)鍵字和{}聲明的代碼塊:

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

②、執(zhí)行時(shí)機(jī) 靜態(tài)代碼塊在類被加載的時(shí)候就運(yùn)行了,而且只運(yùn)行一次,并且優(yōu)先于各種代碼塊以及構(gòu)造函數(shù)。如果一個(gè)類中有多個(gè)靜態(tài)代碼塊,會(huì)按照書寫順序依次執(zhí)行。后面在比較的時(shí)候會(huì)通過(guò)具體實(shí)例來(lái)證明。

③、靜態(tài)代碼塊的作用 一般情況下,如果有些代碼需要在項(xiàng)目啟動(dòng)的時(shí)候就執(zhí)行,這時(shí)候就需要靜態(tài)代碼塊。比如一個(gè)項(xiàng)目啟動(dòng)需要加載的很多配置文件等資源,我們就可以都放入靜態(tài)代碼塊中。

④、靜態(tài)代碼塊不能存在任何方法體中 這個(gè)應(yīng)該很好理解,首先我們要明確靜態(tài)代碼塊是在類加載的時(shí)候就要運(yùn)行了。我們分情況討論:

對(duì)于普通方法,由于普通方法是通過(guò)加載類,然后new出實(shí)例化對(duì)象,通過(guò)對(duì)象才能運(yùn)行這個(gè)方法,而靜態(tài)代碼塊只需要加載類之后就能運(yùn)行了。

對(duì)于靜態(tài)方法,在類加載的時(shí)候,靜態(tài)方法也已經(jīng)加載了,但是我們必須要通過(guò)類名或者對(duì)象名才能訪問(wèn),也就是說(shuō)相比于靜態(tài)代碼塊,靜態(tài)代碼塊是主動(dòng)運(yùn)行的,而靜態(tài)方法是被動(dòng)運(yùn)行的。

不管是哪種方法,我們需要明確靜態(tài)代碼塊的存在在類加載的時(shí)候就自動(dòng)運(yùn)行了,而放在不管是普通方法還是靜態(tài)方法中,都是不能自動(dòng)運(yùn)行的。

⑤、靜態(tài)代碼塊不能訪問(wèn)普通變量 這個(gè)理解思維同上,普通變量只能通過(guò)對(duì)象來(lái)調(diào)用,是不能放在靜態(tài)代碼塊中的。

2、構(gòu)造代碼塊

①、格式 在java類中使用{}聲明的代碼塊(和靜態(tài)代碼塊的區(qū)別是少了static關(guān)鍵字):

public class CodeBlock {
    static{
        System.out.println("靜態(tài)代碼塊");
    }
    {
        System.out.println("構(gòu)造代碼塊");
    }
}

②、執(zhí)行時(shí)機(jī) 構(gòu)造代碼塊在創(chuàng)建對(duì)象時(shí)被調(diào)用,每次創(chuàng)建對(duì)象都會(huì)調(diào)用一次,但是優(yōu)先于構(gòu)造函數(shù)執(zhí)行。需要注意的是,聽(tīng)名字我們就知道,構(gòu)造代碼塊不是優(yōu)先于構(gòu)造函數(shù)執(zhí)行,而是依托于構(gòu)造函數(shù),也就是說(shuō),如果你不實(shí)例化對(duì)象,構(gòu)造代碼塊是不會(huì)執(zhí)行的。怎么理解呢?我們看看下面這段代碼:

public class CodeBlock {
    {
        System.out.println("構(gòu)造代碼塊");
    }
     
    public CodeBlock(){
        System.out.println("無(wú)參構(gòu)造函數(shù)");
    }
    public CodeBlock(String str){
        System.out.println("有參構(gòu)造函數(shù)");
    }
}

我們反編譯生成的class文件:

圖片

如果存在多個(gè)構(gòu)造代碼塊,則執(zhí)行順序按照書寫順序依次執(zhí)行。

③、構(gòu)造代碼塊的作用 和構(gòu)造函數(shù)的作用類似,都能對(duì)對(duì)象進(jìn)行初始化,并且只要?jiǎng)?chuàng)建一個(gè)對(duì)象,構(gòu)造代碼塊都會(huì)執(zhí)行一次。但是反過(guò)來(lái),構(gòu)造函數(shù)則不一定每個(gè)對(duì)象建立時(shí)都執(zhí)行(多個(gè)構(gòu)造函數(shù)情況下,建立對(duì)象時(shí)傳入的參數(shù)不同則初始化使用對(duì)應(yīng)的構(gòu)造函數(shù))。

利用每次創(chuàng)建對(duì)象的時(shí)候都會(huì)提前調(diào)用一次構(gòu)造代碼塊特性,我們可以做諸如統(tǒng)計(jì)創(chuàng)建對(duì)象的次數(shù)等功能。

3、構(gòu)造函數(shù)

1.構(gòu)造函數(shù)的命名必須和類名完全相同。在java中普通函數(shù)可以和構(gòu)造函數(shù)同名,但是必須帶有返回值;

2.構(gòu)造函數(shù)的功能主要用于在類的對(duì)象創(chuàng)建時(shí)定義初始化的狀態(tài)。它沒(méi)有返回值,也不能用void來(lái)修飾。這就保證了它不僅什么也不用自動(dòng)返回,而且根本不能有任何選擇。而其他方法都有返回值,即使是void返回值。盡管方法體本身不會(huì)自動(dòng)返回什么,但仍然可以讓它返回一些東西,而這些東西可能是不安全的;

3.構(gòu)造函數(shù)不能被直接調(diào)用,必須通過(guò)new運(yùn)算符在創(chuàng)建對(duì)象時(shí)才會(huì)自動(dòng)調(diào)用;而一般的方法是在程序執(zhí)行到它的時(shí)候被調(diào)用的;

4.當(dāng)定義一個(gè)類的時(shí)候,通常情況下都會(huì)顯示該類的構(gòu)造函數(shù),并在函數(shù)中指定初始化的工作也可省略,不過(guò)Java編譯器會(huì)提供一個(gè)默認(rèn)的構(gòu)造函數(shù).此默認(rèn)構(gòu)造函數(shù)是不帶參數(shù)的。而一般的方法不存在這一特點(diǎn);

4、普通代碼塊

普通代碼塊和構(gòu)造代碼塊的區(qū)別是,構(gòu)造代碼塊是在類中定義的,而普通代碼塊是在方法體中定義的。且普通代碼塊的執(zhí)行順序和書寫順序一致。

public void sayHello(){
    {
        System.out.println("普通代碼塊");
    }
}

5、執(zhí)行順序

靜態(tài)代碼塊>構(gòu)造代碼塊>構(gòu)造函數(shù)>普通代碼塊

public class CodeBlock {
    static{
        System.out.println("靜態(tài)代碼塊");
    }
    {
        System.out.println("構(gòu)造代碼塊");
    }
    public CodeBlock(){
        System.out.println("無(wú)參構(gòu)造函數(shù)");
    }
     
    public void sayHello(){
        {
            System.out.println("普通代碼塊");
        }
    }
     
    public static void main(String[] args) {
        System.out.println("執(zhí)行了main方法");
         
        new CodeBlock().sayHello();;
        System.out.println("---------------");
        new CodeBlock().sayHello();;
    }
}

反編譯生成的class文件:

圖片

執(zhí)行結(jié)果:

圖片

我們創(chuàng)建了兩個(gè)匿名對(duì)象,但是靜態(tài)代碼塊只是調(diào)用了一次。

6、父類和子類執(zhí)行順序

對(duì)象的初始化順序:

首先執(zhí)行父類靜態(tài)的內(nèi)容,父類靜態(tài)的內(nèi)容執(zhí)行完畢后,接著去執(zhí)行子類的靜態(tài)的內(nèi)容,當(dāng)子類的靜態(tài)內(nèi)容執(zhí)行完畢之后,再去看父類有沒(méi)有構(gòu)造代碼塊,如果有就執(zhí)行父類的構(gòu)造代碼塊,父類的構(gòu)造代碼塊執(zhí)行完畢,接著執(zhí)行父類的構(gòu)造方法;父類的構(gòu)造方法執(zhí)行完畢之后,它接著去看子類有沒(méi)有構(gòu)造代碼塊,如果有就執(zhí)行子類的構(gòu)造代碼塊。子類的構(gòu)造代碼塊執(zhí)行完畢再去執(zhí)行子類的構(gòu)造方法。

總之一句話,靜態(tài)代碼塊內(nèi)容先執(zhí)行,接著執(zhí)行父類構(gòu)造代碼塊和構(gòu)造方法,然后執(zhí)行子類構(gòu)造代碼塊和構(gòu)造方法。

父類:SuperClass.java

package com.ys.extend;
 
public class SuperClass {
    static{
        System.out.println("父類靜態(tài)代碼塊");
    }
    {
        System.out.println("父類構(gòu)造代碼塊");
    }
    public SuperClass(){
        System.out.println("父類構(gòu)造函數(shù)");
    }
}

子類:SubClass.java

package com.ys.extend;
 
public class SubClass extends SuperClass{
    static{
        System.out.println("子類靜態(tài)代碼塊");
    }
     
    {
        System.out.println("子類構(gòu)造代碼塊");
    }
     
    public SubClass(){
        System.out.println("子類構(gòu)造函數(shù)");
    }
     
}

測(cè)試:

public static void main(String[] args) {
    SubClass sb = new SubClass();
    System.out.println("------------");
    SubClass sb1 = new SubClass();
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2987

    瀏覽量

    107360
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4374

    瀏覽量

    64434
  • 靜態(tài)
    +關(guān)注

    關(guān)注

    1

    文章

    29

    瀏覽量

    14720
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4891

    瀏覽量

    70382
  • static
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    10649
收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何查看及更改函數(shù)/函數(shù)的調(diào)用環(huán)境

    模塊化設(shè)計(jì)的思想是把一些相似的功能(比如電機(jī)控制、閥控制)設(shè)計(jì)成函數(shù)函數(shù),這樣就可以反復(fù)調(diào)用。其優(yōu)點(diǎn)是:使程序架構(gòu)更加清晰,避免重復(fù)編寫相似功能的代碼。不過(guò)可能會(huì)產(chǎn)生一個(gè)疑惑:既然
    的頭像 發(fā)表于 11-17 09:08 ?1413次閱讀
    如何查看及更改<b class='flag-5'>函數(shù)</b>/<b class='flag-5'>函數(shù)</b><b class='flag-5'>塊</b>的調(diào)用環(huán)境

    順序類型在中未連接

    :2677- 順序類型的節(jié)點(diǎn)在中未連接。警告:Xst:2677 - 順序類型的節(jié)點(diǎn)在中未連接。警告:Xst:2677- 順序類型的節(jié)點(diǎn)在
    發(fā)表于 03-07 14:06

    pid代碼執(zhí)行的時(shí)間

    直接來(lái)干貨吧對(duì)于單片機(jī)來(lái)說(shuō) pid 是一個(gè) 每隔多長(zhǎng)時(shí)間執(zhí)行一次 的代碼 而這個(gè)時(shí)間通常就是積分時(shí)間我們令這個(gè)代碼快這個(gè)代碼
    發(fā)表于 09-03 07:51

    內(nèi)存操作源代碼

    易語(yǔ)言是一門以中文作為程序代碼編程語(yǔ)言學(xué)習(xí)例程:易語(yǔ)言-內(nèi)存操作
    發(fā)表于 06-06 17:01 ?1次下載

    一種新穎的復(fù)用代碼精確快速溯源方法

    。對(duì)于待溯源函數(shù),依據(jù)函數(shù)代碼的simhash值快速發(fā)現(xiàn)相似代碼,繼而倒排索引潛在相似
    發(fā)表于 01-31 14:23 ?0次下載
    一種新穎的復(fù)用<b class='flag-5'>代碼</b>精確快速溯源方法

    python基礎(chǔ):如何注釋代碼

    ? ? ? 大家好,又到了每日學(xué)習(xí)的時(shí)間了,最近博主在和python打交道,今天我們來(lái)聊一聊python一些基礎(chǔ)的東西,如何注釋代碼。 ? ? ? ?前言 ? ? ? ?編寫python程序有時(shí)候
    的頭像 發(fā)表于 12-26 22:03 ?5806次閱讀
    python基礎(chǔ):如何注釋<b class='flag-5'>代碼</b><b class='flag-5'>塊</b>

    組合29個(gè)簡(jiǎn)單Python代碼,自動(dòng)發(fā)現(xiàn)新算法

    本文提出了一種基于演化算法的搜索策略,將其AAD中實(shí)現(xiàn)。AAD可以基于Python的子集作為語(yǔ)法結(jié)構(gòu),組合成復(fù)雜度相對(duì)較高的程序(循環(huán),嵌套,嵌套函數(shù)調(diào)用等),并生成可執(zhí)行的Python代碼
    的頭像 發(fā)表于 04-19 13:47 ?3771次閱讀

    基于差異性代碼克隆的代碼補(bǔ)全提示方法

    基于滑動(dòng)窗口和帶誤匹配索引的匹配算法,尋找與待補(bǔ)全代碼相似的候選代碼,并對(duì)其進(jìn)行特征提取、聚類和相關(guān)性排名,以此獲得候選代碼
    發(fā)表于 05-28 11:22 ?4次下載

    TIA Portal的程序保護(hù)功能實(shí)現(xiàn)

    注釋可見(jiàn),而無(wú)法顯示接口參數(shù)Temp、Constant、程序代碼和網(wǎng)段注釋。此時(shí)被保護(hù)的程序也不能被修改。若使用正確的密碼打開(kāi)程序時(shí),可以顯示所有的接口參數(shù)、注釋和程序代碼。此時(shí)被
    的頭像 發(fā)表于 03-14 16:35 ?3092次閱讀
    TIA Portal的程序<b class='flag-5'>塊</b>保護(hù)功能實(shí)現(xiàn)

    SpringBoot如何實(shí)現(xiàn)啟動(dòng)過(guò)程中執(zhí)行代碼

    目前開(kāi)發(fā)的SpringBoot項(xiàng)目在啟動(dòng)的時(shí)候需要預(yù)加載一些資源。而如何實(shí)現(xiàn)啟動(dòng)過(guò)程中執(zhí)行代碼,或啟動(dòng)成功后執(zhí)行,是有很多種方式可以選擇,我們可以在static代碼
    的頭像 發(fā)表于 06-20 17:32 ?1657次閱讀

    PLC編程中OB、FC、FB、DB的使用原則

    西門子新加中包含組織(OB)、函數(shù)(FB)、函數(shù)(FC)、數(shù)據(jù)(DB)
    發(fā)表于 05-24 15:01 ?1.8w次閱讀
    PLC編程中OB<b class='flag-5'>塊</b>、FC<b class='flag-5'>塊</b>、FB<b class='flag-5'>塊</b>、DB<b class='flag-5'>塊</b>的使用原則

    Blockly@rduino:使用創(chuàng)建代碼

    電子發(fā)燒友網(wǎng)站提供《Blockly@rduino:使用創(chuàng)建代碼.zip》資料免費(fèi)下載
    發(fā)表于 07-05 09:22 ?0次下載
    Blockly@rduino:使用<b class='flag-5'>塊</b>創(chuàng)建<b class='flag-5'>代碼</b>

    SIMATIC S7-1500 PLC函數(shù)(FB)及其應(yīng)用

    函數(shù)(FB)屬于自己編程的。函數(shù)是一種“帶內(nèi)存”的。分配數(shù)據(jù)
    的頭像 發(fā)表于 07-25 09:10 ?4017次閱讀
    SIMATIC S7-1500 PLC<b class='flag-5'>函數(shù)</b><b class='flag-5'>塊</b>(FB)及其應(yīng)用

    調(diào)用SCL函數(shù)-事例

    在以下部分中,將在組織“Main” 中調(diào)用 SCL 函數(shù)“SCL_Best_before_date” 并互連輸入和輸出參數(shù)。
    的頭像 發(fā)表于 08-10 09:51 ?1079次閱讀
    調(diào)用SCL<b class='flag-5'>函數(shù)</b><b class='flag-5'>塊</b>-事例

    Python中什么是語(yǔ)句

    條件判斷 語(yǔ)句 什么是語(yǔ)句呢? 語(yǔ)句是在條件為真(條件語(yǔ)句)時(shí)執(zhí)行或者執(zhí)行多次(循環(huán)語(yǔ)句)的一組語(yǔ)句。在
    的頭像 發(fā)表于 09-12 16:41 ?1329次閱讀

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品