最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造函數(shù)和普通代碼塊的區(qū)別

 更新時(shí)間:2023年05月06日 10:14:06   作者:ThinkStu  
在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ì)按照書(shū)寫(xiě)順序依次執(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í)行順序按照書(shū)寫(xiě)順序依次執(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í)行順序和書(shū)寫(xiě)順序一致。

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

子類:SubClass.java

測(cè)試:

打印結(jié)果:

到此這篇關(guān)于Java中靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造函數(shù)和普通代碼塊的區(qū)別的文章就介紹到這了,更多相關(guān)Java靜態(tài)代碼塊和其他代碼塊的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot開(kāi)啟遠(yuǎn)程調(diào)試的方法

    Spring Boot開(kāi)啟遠(yuǎn)程調(diào)試的方法

    這篇文章主要介紹了Spring Boot開(kāi)啟遠(yuǎn)程調(diào)試的方法,幫助大家更好的理解和使用Spring Boot框架,感興趣的朋友可以了解下
    2020-10-10
  • 解決從Map、JSONObject取不存在鍵值對(duì)時(shí)的異常情況

    解決從Map、JSONObject取不存在鍵值對(duì)時(shí)的異常情況

    這篇文章主要介紹了解決從Map、JSONObject取不存在鍵值對(duì)時(shí)的異常情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java實(shí)戰(zhàn)之電影在線觀看系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)之電影在線觀看系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要介紹了如何利用Java實(shí)現(xiàn)電影在線觀看系統(tǒng),文中用到的技術(shù)有:JSP、Spring、SpringMVC、MyBatis等,感興趣的可以了解一下
    2022-04-04
  • SpringBoot整合RabbitMQ, 實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者的功能

    SpringBoot整合RabbitMQ, 實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者的功能

    這篇文章主要介紹了SpringBoot整合RabbitMQ, 實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者的功能,幫助大家更好得理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下
    2021-03-03
  • Spring Cloud Gateway自定義異常處理Exception Handler的方法小結(jié)

    Spring Cloud Gateway自定義異常處理Exception Handler的方法小結(jié)

    這篇文章主要介紹了Spring Cloud Gateway自定義異常處理Exception Handler的方法,本文通過(guò)兩種方法結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • swagger?@ApiModel添加實(shí)體類不生效的解決

    swagger?@ApiModel添加實(shí)體類不生效的解決

    這篇文章主要介紹了swagger?@ApiModel添加實(shí)體類不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • SpringMVC+MyBatis聲明式事務(wù)管理

    SpringMVC+MyBatis聲明式事務(wù)管理

    在最近的一個(gè)項(xiàng)目中,采用springMVC、mybatis,MySQL、tomcat,事務(wù)管理對(duì)于企業(yè)應(yīng)用來(lái)說(shuō)是至關(guān)重要的,即使出現(xiàn)異常情況,它也可以保證數(shù)據(jù)的一致性。Spring Framework對(duì)事務(wù)管理提供了一致的抽象,
    2015-08-08
  • Servlet 過(guò)濾器詳細(xì)介紹

    Servlet 過(guò)濾器詳細(xì)介紹

    這篇文章介紹了Servlet 過(guò)濾器,有需要的朋友可以參考一下
    2013-10-10
  • Set接口深入剖析之HashSet、LinkedHashSet和TreeSet

    Set接口深入剖析之HashSet、LinkedHashSet和TreeSet

    這篇文章主要介紹了Set接口深入剖析之HashSet、LinkedHashSet和TreeSet,LinkedHashSet是HashSet的子類,實(shí)現(xiàn)了Set接口,LinkedHashSet底層是一個(gè)LinkedHashMap,底層維護(hù)了一個(gè)數(shù)組+雙向鏈表,需要的朋友可以參考下
    2023-09-09
  • 徹底搞懂Java多線程(二)

    徹底搞懂Java多線程(二)

    這篇文章主要給大家介紹了關(guān)于Java面試題之多線程和高并發(fā)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07

最新評(píng)論

门源| 旌德县| 林甸县| 鄯善县| 阿巴嘎旗| 江达县| 英山县| 夏津县| 辰溪县| 巴里| 进贤县| 南木林县| 普陀区| 长海县| 鹤山市| 虞城县| 宜良县| 印江| 虹口区| 故城县| 保亭| 台东县| 永川市| 独山县| 桂东县| 拉萨市| 专栏| 双流县| 灌云县| 武清区| 堆龙德庆县| 汾西县| 赤壁市| 怀仁县| 江陵县| 建瓯市| 青海省| 丘北县| 香河县| 郓城县| 马龙县|