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

Java程序的初始化順序,static{}靜態(tài)代碼塊和實(shí)例語句塊的使用方式

 更新時(shí)間:2024年01月30日 14:20:06   作者:pan_junbiao  
這篇文章主要介紹了Java程序的初始化順序,static{}靜態(tài)代碼塊和實(shí)例語句塊的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1、Java程序的初始化順序

在 Java 語言中,當(dāng)實(shí)例對象時(shí),對象所在類的所有成員變量首先要進(jìn)行初始化,只有當(dāng)所有類成員完成初始化后,才會調(diào)用對象所在的構(gòu)造函數(shù)創(chuàng)建對象。

Java 程序的初始化一般遵循以下三個(gè)原則:

  • 靜態(tài)對象(變量)、非靜態(tài)對象(變量)。
  • 父類優(yōu)先于子類進(jìn)行初始化。
  • 按照成員變量定義順序進(jìn)行初始化。

Java 程序的初始化工作可以在許多不同的代碼塊中來完成,

例如:靜態(tài)代碼塊、實(shí)例語句塊、構(gòu)造函數(shù)等。

1.1 普通類的執(zhí)行順序

普通類的執(zhí)行順序?yàn)椋红o態(tài)代碼塊 → 實(shí)例語句塊 → 構(gòu)造函數(shù)。

【示例】普通類的執(zhí)行順序。

(1)創(chuàng)建普通類

/**
 * 普通類
 * @author pan_junbiao
 **/
public class MyClass
{
    //靜態(tài)代碼塊
    static
    {
        System.out.println("靜態(tài)代碼塊");
    }
 
    //實(shí)例語句塊
    {
        System.out.println("實(shí)例語句塊");
    }
 
    //構(gòu)造函數(shù)
    public MyClass()
    {
        System.out.println("構(gòu)造函數(shù)");
    }
}

(2)執(zhí)行方法

/**
 * Java普通類的執(zhí)行順序
 * @author pan_junbiao
 */
public static void main(String[] args)
{
    //創(chuàng)建普通類對象
    MyClass myClass = new MyClass();
}

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

1.2 繼承類的執(zhí)行順序

繼承類的執(zhí)行順序?yàn)椋焊割愳o態(tài)代碼塊 → 子類靜態(tài)代碼塊 → 父類實(shí)例語句塊 → 父類構(gòu)造函數(shù) → 子類實(shí)例語句塊 → 子類構(gòu)造函數(shù)。

【示例】繼承類的執(zhí)行順序。

(1)創(chuàng)建父類

/**
 * 父類
 * @author pan_junbiao
 **/
public class Parent
{
    //靜態(tài)代碼塊
    static
    {
        System.out.println("父類靜態(tài)代碼塊");
    }
 
    //實(shí)例語句塊
    {
        System.out.println("父類實(shí)例語句塊");
    }
 
    //構(gòu)造函數(shù)
    public Parent()
    {
        System.out.println("父類構(gòu)造函數(shù)");
    }
}

(2)創(chuàng)建子類

/**
 * 子類
 * @author pan_junbiao
 **/
public class Child extends Parent
{
    //靜態(tài)代碼塊
    static
    {
        System.out.println("子類靜態(tài)代碼塊");
    }
 
    //實(shí)例語句塊
    {
        System.out.println("子類實(shí)例語句塊");
    }
 
    //構(gòu)造函數(shù)
    public Child()
    {
        System.out.println("子類構(gòu)造函數(shù)");
    }
}

(3)執(zhí)行方法

/**
 * Java繼承類的執(zhí)行順序
 * @author pan_junbiao
 */
public static void main(String[] args)
{
    //創(chuàng)建子類對象
    Child child = new Child();
}

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

1.3 成員變量初始化的優(yōu)先級

這里需要注意的是,(靜態(tài))非靜態(tài)成員域在定義時(shí)初始化和(靜態(tài))非靜態(tài)塊中初始化的優(yōu)先級是平級的,也就是說按照從上到下初始化,最后一次初始化為最終的值(不包括非靜態(tài)的成員域在構(gòu)造器中初始化)。

所以在(靜態(tài))非靜態(tài)塊中初始化的域甚至能在該域聲明的上方,因?yàn)榉峙浯鎯臻g在初始化之前就完成了。

【示例】(靜態(tài))非靜態(tài)塊中成員變量初始化的優(yōu)先級。

/**
 * (靜態(tài))非靜態(tài)塊中成員變量初始化的優(yōu)先級
 * @author pan_junbiao
 **/
public class TestStatic
{
    static { a = 2;}
    static int a = 1;
    static int b = 3;
    static { b = 4; }
 
    public static void main(String[] args)
    {
        System.out.println("初始化后的變量的值:");
        System.out.println(a);
        System.out.println(b);
    }
}

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

2、static{}靜態(tài)代碼塊的使用

static{} 靜態(tài)代碼塊在類的加載時(shí)執(zhí)行,并且只執(zhí)行一次,且在 main 方法之前執(zhí)行。一個(gè)類中可以有多個(gè)靜態(tài)代碼塊,執(zhí)行順序自上而下。一個(gè)靜態(tài)代碼塊只能訪問該靜態(tài)代碼塊之前的靜態(tài)變量。

static{} 靜態(tài)代碼塊在類初次被加載的時(shí)候執(zhí)行且僅會被執(zhí)行一次,所以可以起到優(yōu)化程序性能的作用。

static{} 靜態(tài)代碼塊的語法:

//靜態(tài)代碼塊
static
{
    //Java程序
}

3、實(shí)例語句塊的使用

除了static{} 靜態(tài)代碼塊之外,還有一種語句塊叫做:實(shí)例語句塊。

顧名思義,就是在實(shí)例化對象時(shí)執(zhí)行,并不是在類加載時(shí)執(zhí)行。

實(shí)例語句塊的具體執(zhí)行時(shí)間是在實(shí)例化對象時(shí)的構(gòu)造函數(shù)之前執(zhí)行的。

實(shí)例語句塊的語法:

//實(shí)例語句塊
{
    //Java程序
}

4、練習(xí)題目

最后來一道題目練習(xí)一下關(guān)于 static{} 靜態(tài)代碼塊、實(shí)例語句塊和構(gòu)造函數(shù)的執(zhí)行順序。

例題如下:

/**
 * 判斷以下程序的執(zhí)行順序
 * @author pan_junbiao
 **/
public class CodeOrder
{
    //靜態(tài)代碼塊
    static
    {
        System.out.println("A");
    }
 
    //程序入口
    public static void main(String[] args)
    {
        System.out.println("Y");
        new CodeOrder();
        System.out.println("Z");
    }
 
    //構(gòu)造函數(shù)
    public CodeOrder()
    {
        System.out.println("B");
    }
 
    //實(shí)例語句塊
    {
        System.out.println("C");
    }
 
    //靜態(tài)代碼塊
    static
    {
        System.out.println("X");
    }
}

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java IO流 之 輸出流 OutputString()的使用

    java IO流 之 輸出流 OutputString()的使用

    這篇文章主要介紹了java IO流 之 輸出流 OutputString()的使用的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • JavaSE的類和對象你真的了解嗎

    JavaSE的類和對象你真的了解嗎

    這篇文章主要為大家詳細(xì)介紹了JavaSE的類和對象,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • java中文及特殊字符的校驗(yàn)方法

    java中文及特殊字符的校驗(yàn)方法

    這篇文章主要為大家詳細(xì)介紹了java中文及特殊字符的校驗(yàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java多線程——基礎(chǔ)概念

    Java多線程——基礎(chǔ)概念

    這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下,希望可以幫到你
    2021-07-07
  • 向量數(shù)據(jù)庫之如何使用Elasticsearch實(shí)現(xiàn)向量數(shù)據(jù)存儲與搜索

    向量數(shù)據(jù)庫之如何使用Elasticsearch實(shí)現(xiàn)向量數(shù)據(jù)存儲與搜索

    這篇文章主要介紹了向量數(shù)據(jù)庫之如何使用Elasticsearch實(shí)現(xiàn)向量數(shù)據(jù)存儲與搜索,在向量函數(shù)的計(jì)算過程中,會對所有匹配的文檔進(jìn)行線性掃描,因此,查詢預(yù)計(jì)時(shí)間會隨著匹配文檔的數(shù)量線性增長,本文給大家講解的非常詳細(xì),需要的朋友參考下吧
    2023-06-06
  • java實(shí)現(xiàn)桌球小游戲

    java實(shí)現(xiàn)桌球小游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)桌球小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java Map 按照Value排序的實(shí)現(xiàn)方法

    Java Map 按照Value排序的實(shí)現(xiàn)方法

    Map是鍵值對的集合接口,它的實(shí)現(xiàn)類主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。這篇文章主要介紹了Java Map 按照Value排序的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2016-08-08
  • Java HtmlParse提取標(biāo)簽中的值操作

    Java HtmlParse提取標(biāo)簽中的值操作

    這篇文章主要介紹了Java HtmlParse提取標(biāo)簽中的值操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 如何將Java與C#時(shí)間進(jìn)行互相轉(zhuǎn)換

    如何將Java與C#時(shí)間進(jìn)行互相轉(zhuǎn)換

    這篇文章主要介紹了Java與C#時(shí)間互轉(zhuǎn)的方法以及JAVA日期、C#日期計(jì)算說明,需要的朋友可以參考下
    2022-11-11
  • SpringBoot整合Mybatis自定義攔截器不起作用的處理方案

    SpringBoot整合Mybatis自定義攔截器不起作用的處理方案

    這篇文章主要介紹了SpringBoot整合Mybatis自定義攔截器不起作用的處理方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論