欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2023年05月06日 10:14:06   作者:ThinkStu  
在Java中,靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造函數(shù)、普通代碼塊的執(zhí)行順序是一個筆試的考點,通過這篇文章希望大家能徹底了解它們之間的執(zhí)行順序,需要的朋友可以參考下

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

①、格式

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

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

②、執(zhí)行時機

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

③、靜態(tài)代碼塊的作用

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

④、靜態(tài)代碼塊不能存在任何方法體中

這個應(yīng)該很好理解,首先我們要明確靜態(tài)代碼塊是在類加載的時候就要運行了。我們分情況討論:

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

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

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

⑤、靜態(tà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í)行時機

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

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

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

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

③、構(gòu)造代碼塊的作用

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

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

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

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

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

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

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

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("無參構(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)建了兩個匿名對象,但是靜態(tài)代碼塊只是調(diào)用了一次。

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

對象的初始化順序:

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

測試:

打印結(jié)果:

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

相關(guān)文章

  • Springboot實現(xiàn)VNC的反向代理功能

    Springboot實現(xiàn)VNC的反向代理功能

    這篇文章主要介紹了Springboot實現(xiàn)VNC的反向代理,搭建過程也很簡單,通過注冊bean攔截指定URL路徑進行自定義操作,具體實例代碼跟隨小編一起看看需要的朋友可以參考下
    2021-09-09
  • 正確結(jié)束Java線程的方法

    正確結(jié)束Java線程的方法

    線程的啟動很簡單,但用戶可能隨時取消任務(wù),怎么樣讓跑起來的線程正確地結(jié)束,這是今天要討論的話題。下面小編來和大家一起學(xué)習(xí)一下吧
    2019-05-05
  • SpringBoot導(dǎo)出Excel的四種實現(xiàn)方式

    SpringBoot導(dǎo)出Excel的四種實現(xiàn)方式

    近期接到了一個小需求,要將系統(tǒng)中的數(shù)據(jù)導(dǎo)出為Excel,且能將Excel數(shù)據(jù)導(dǎo)入到系統(tǒng),對于大多數(shù)研發(fā)人員來說,這算是一個最基本的操作了,本文就給大家總結(jié)一下SpringBoot導(dǎo)出Excel的四種實現(xiàn)方式,需要的朋友可以參考下
    2024-01-01
  • Spark Streaming算子開發(fā)實例

    Spark Streaming算子開發(fā)實例

    這篇文章主要介紹了Spark Streaming算子開發(fā)實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • clickhouse?批量插入數(shù)據(jù)及ClickHouse常用命令詳解

    clickhouse?批量插入數(shù)據(jù)及ClickHouse常用命令詳解

    這篇文章主要介紹了clickhouse?批量插入數(shù)據(jù)及ClickHouse常用命令,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • SpringBoot配置mybatis駝峰命名規(guī)則自動轉(zhuǎn)換的實現(xiàn)

    SpringBoot配置mybatis駝峰命名規(guī)則自動轉(zhuǎn)換的實現(xiàn)

    這篇文章主要介紹了SpringBoot配置mybatis駝峰命名規(guī)則自動轉(zhuǎn)換的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Struts2學(xué)習(xí)筆記(2)-路徑問題解決

    Struts2學(xué)習(xí)筆記(2)-路徑問題解決

    本文主要介紹Struts2的路徑問題,盡量不要使用相對路徑,使用相對路徑會讓路徑問題變得很繁瑣很麻煩,推薦使用絕對路徑,希望能給大家做一個參考。
    2016-06-06
  • Java實現(xiàn)簡單無界面五子棋

    Java實現(xiàn)簡單無界面五子棋

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單無界面五子棋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • java使用@Scheduled注解執(zhí)行定時任務(wù)

    java使用@Scheduled注解執(zhí)行定時任務(wù)

    這篇文章主要給大家介紹了關(guān)于java使用@Scheduled注解執(zhí)行定時任務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python學(xué)習(xí)之書寫格式及變量命名

    Python學(xué)習(xí)之書寫格式及變量命名

    這篇文章我們給大家總結(jié)了關(guān)于Python書寫格式及變量命名,小編覺得這篇文章寫的還不錯,有興趣的朋友跟著參考學(xué)習(xí)下,希望能夠給你帶來幫助
    2021-10-10

最新評論