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

關于Java中代碼塊的執(zhí)行順序

 更新時間:2023年08月22日 09:58:29   作者:ycfxhsw  
這篇文章主要介紹了關于Java中代碼塊的執(zhí)行順序,構造代碼塊是給所有對象進行統(tǒng)一初始化,而構造函數是給對應的對象初始化,因為構造函數是可以多個的,運行哪個構造函數就會建立什么樣的對象,但無論建立哪個對象,都會先執(zhí)行相同的構造代碼塊,需要的朋友可以參考下

前言

先說總結:

父類靜態(tài)字段 —> 父類靜態(tài)代碼塊 —> 子類靜態(tài)字段 —> 子類靜態(tài)代碼塊 —> 父類成員變量和非靜態(tài)塊(順序加載) —> 父類構造函數 —> 子類成員變量和非靜態(tài)塊(順序加載) —> 子類構造函數

在這里插入圖片描述

  • 靜態(tài)代碼塊:用staitc聲明,jvm加載類時執(zhí)行,僅執(zhí)行一次。
  • 構造代碼塊:類中直接用{}定義,每一次創(chuàng)建對象時執(zhí)行。
  • 執(zhí)行順序優(yōu)先級:靜態(tài)塊,main(),構造塊,構造方法。

構造函數

public HelloA(){//構造函數
}

關于構造函數,以下幾點要注意:

  • 對象一建立,就會調用與之相應的構造函數,也就是說,不建立對象,構造函數時不會運行的。
  • 構造函數的作用是用于給對象進行初始化。
  • 一個對象建立,構造函數只運行一次,而一般方法可以被該對象調用多次。

構造代碼塊

{//構造代碼塊    
}

關于構造代碼塊,以下幾點要注意:

  • 構造代碼塊的作用是給對象進行初始化。
  • 對象一建立就運行構造代碼塊了,而且優(yōu)先于構造函數執(zhí)行。這里要強調一下,有對象建立,才會運行構造代碼塊,類不能調用構造代碼塊的,而且構造代碼塊與構造函數的執(zhí)行順序是前者先于后者執(zhí)行。
  • 構造代碼塊與構造函數的區(qū)別是:構造代碼塊是給所有對象進行統(tǒng)一初始化,而構造函數是給對應的對象初始化,因為構造函數是可以多個的,運行哪個構造函數就會建立什么樣的對象,但無論建立哪個對象,都會先執(zhí)行相同的構造代碼塊。也就是說,構造代碼塊中定義的是不同對象共性的初始化內容。

靜態(tài)代碼塊

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

關于靜態(tài)代碼塊,要注意的是:

  • 它是隨著類的加載而執(zhí)行,只執(zhí)行一次,并優(yōu)先于主函數。具體說,靜態(tài)代碼塊是由類調用的。類調用時,先執(zhí)行靜態(tài)代碼塊,然后才執(zhí)行主函數的。
  • 靜態(tài)代碼塊其實就是給類初始化的,而構造代碼塊是給對象初始化的。
  • 靜態(tài)代碼塊中的變量是局部變量,與普通函數中的局部變量性質沒有區(qū)別。
  • 一個類中可以有多個靜態(tài)代碼塊。
public class Test {
    staitc int cnt=6;
    static {
        cnt += 9;
    }
    public static void main(String[] args) {
        System.out.println(cnt);
    }
    static {
        cnt /= 3;
    }
}
// 5

Java類初始化順序

對于一個類的情況

public class HelloA {
    public HelloA(){//構造函數
        System.out.println("A的構造函數");    
    }
    {//構造代碼塊
        System.out.println("A的構造代碼塊");    
    }
    static {//靜態(tài)代碼塊
        System.out.println("A的靜態(tài)代碼塊");        
    }
    public static void main(String[] args) {
    }
}
// A的靜態(tài)代碼塊
public class HelloA {
    public HelloA(){//構造函數
        System.out.println("A的構造函數");    
    }
    {//構造代碼塊
        System.out.println("A的構造代碼塊");    
    }
    static {//靜態(tài)代碼塊
        System.out.println("A的靜態(tài)代碼塊");        
    }
    public static void main(String[] args) {
        HelloA a=new HelloA();    
    }
}
// A的靜態(tài)代碼塊
// A的構造代碼塊
// A的構造函數
public class HelloA {
    public HelloA(){//構造函數
        System.out.println("A的構造函數");    
    }
    {//構造代碼塊
        System.out.println("A的構造代碼塊");    
    }
    static {//靜態(tài)代碼塊
        System.out.println("A的靜態(tài)代碼塊");        
    }
    public static void main(String[] args) {
        HelloA a=new HelloA();
        HelloA b=new HelloA();
    }
}
// A的靜態(tài)代碼塊
// A的構造代碼塊
// A的構造函數
// A的構造代碼塊
// A的構造函數

對于一個類而言,按照如下順序執(zhí)行:

  • 執(zhí)行靜態(tài)代碼塊
  • 執(zhí)行構造代碼塊
  • 執(zhí)行構造函數

對于靜態(tài)變量、靜態(tài)初始化塊、變量、初始化塊、構造器,它們的初始化順序依次是靜態(tài)變量、靜態(tài)初始化塊)>(變量、初始化塊)>構造器。

public class InitialOrderTest {
        /* 靜態(tài)變量 */
    public static String staticField = "靜態(tài)變量";
        /* 變量 */
    public String field = "變量";
        /* 靜態(tài)初始化塊 */
    static {
        System.out.println( staticField );
        System.out.println( "靜態(tài)初始化塊" );
    }
        /* 初始化塊 */
    {
        System.out.println( field );
        System.out.println( "初始化塊" );
    }
        /* 構造器 */
    public InitialOrderTest(){
        System.out.println( "構造器" );
    }
    public static void main( String[] args ){
        new InitialOrderTest();
    }
}
// 靜態(tài)變量
// 靜態(tài)初始化塊
// 變量
// 初始化塊
// 構造器

對于繼承情況

public class HelloA {
    public HelloA(){//構造函數
        System.out.println("A的構造函數");    
    }
    {//構造代碼塊
        System.out.println("A的構造代碼塊");    
    }
    static {//靜態(tài)代碼塊
        System.out.println("A的靜態(tài)代碼塊");        
    }
}
public class HelloB extends HelloA{
    public HelloB(){//構造函數
        System.out.println("B的構造函數");    
    }
    {//構造代碼塊
        System.out.println("B的構造代碼塊");    
    }
    static {//靜態(tài)代碼塊
        System.out.println("B的靜態(tài)代碼塊");        
    }
    public static void main(String[] args) {
        HelloB b=new HelloB();        
    }
}
// A的靜態(tài)代碼塊
// B的靜態(tài)代碼塊
// A的構造代碼塊
// A的構造函數
// B的構造代碼塊
// B的構造函數

當涉及到繼承時,按照如下順序執(zhí)行:

  • 執(zhí)行父類的靜態(tài)代碼塊,并初始化父類靜態(tài)成員變量
  • 執(zhí)行子類的靜態(tài)代碼塊,并初始化子類靜態(tài)成員變量
  • 執(zhí)行父類的構造代碼塊,執(zhí)行父類的構造函數,并初始化父類普通成員變量
  • 執(zhí)行子類的構造代碼塊, 執(zhí)行子類的構造函數,并初始化子類普通成員變量
class Parent {
        /* 靜態(tài)變量 */
    public static String p_StaticField = "父類--靜態(tài)變量";
         /* 變量 */
    public String p_Field = "父類--變量";
    protected int i = 9;
    protected int j = 0;
        /* 靜態(tài)初始化塊 */
    static {
        System.out.println( p_StaticField );
        System.out.println( "父類--靜態(tài)初始化塊" );
    }
        /* 初始化塊 */
    {
        System.out.println( p_Field );
        System.out.println( "父類--初始化塊" );
    }
        /* 構造器 */
    public Parent(){
        System.out.println( "父類--構造器" );
        System.out.println( "i=" + i + ", j=" + j );
        j = 20;
    }
}
public class SubClass extends Parent {
         /* 靜態(tài)變量 */
    public static String s_StaticField = "子類--靜態(tài)變量";
         /* 變量 */
    public String s_Field = "子類--變量";
        /* 靜態(tài)初始化塊 */
    static {
        System.out.println( s_StaticField );
        System.out.println( "子類--靜態(tài)初始化塊" );
    }
       /* 初始化塊 */
    {
        System.out.println( s_Field );
        System.out.println( "子類--初始化塊" );
    }
       /* 構造器 */
    public SubClass(){
        System.out.println( "子類--構造器" );
        System.out.println( "i=" + i + ",j=" + j );
    }
        /* 程序入口 */
    public static void main( String[] args ){
        System.out.println( "子類main方法" );
        new SubClass();
    }
}
// 父類--靜態(tài)變量
// 父類--靜態(tài)初始化塊
// 子類--靜態(tài)變量
// 子類--靜態(tài)初始化塊
// 子類main方法
// 父類--變量
// 父類--初始化塊
// 父類--構造器
// i=9, j=0
// 子類--變量
// 子類--初始化塊
// 子類--構造器
// i=9,j=20

子類的靜態(tài)變量和靜態(tài)初始化塊的初始化是在父類的變量、初始化塊和構造器初始化之前就完成了。

靜態(tài)變量、靜態(tài)初始化塊,變量、初始化塊初始化了順序取決于它們在類中出現(xiàn)的先后順序。

到此這篇關于關于Java中代碼塊的執(zhí)行順序的文章就介紹到這了,更多相關Java代碼塊執(zhí)行內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java學生信息管理系統(tǒng)設計

    java學生信息管理系統(tǒng)設計

    這篇文章主要為大家詳細介紹了java學生信息管理系統(tǒng)設計,學生信息添加進入數據庫的事務,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • IntelliJ IDEA遠程Debug Linux的Java程序,找問題不要只會看日志了(推薦)

    IntelliJ IDEA遠程Debug Linux的Java程序,找問題不要只會看日志了(推薦)

    這篇文章主要介紹了IntelliJ IDEA遠程Debug Linux的Java程序,找問題不要只會看日志了,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Knife4j的請求示例當中有很多空白行的問題解決辦法

    Knife4j的請求示例當中有很多空白行的問題解決辦法

    這篇文章主要介紹了Knife4j的請求示例當中有很多空白行的問題解決辦法,按正常來說不應該有上方的空白,當然如果只是查看我也不至于非要解決他,主要是假如接口是json傳參,調試界面都沒辦法修改參數,遇到同樣問題的同學可以參考閱讀本文
    2024-09-09
  • 詳解Java分布式系統(tǒng)中一致性哈希算法

    詳解Java分布式系統(tǒng)中一致性哈希算法

    這篇文章主要介紹了Java分布式系統(tǒng)中一致性哈希算法,對算法感興趣的同學,可以參考下
    2021-04-04
  • Java如何使用遞歸查詢多級樹形結構數據(多級菜單)

    Java如何使用遞歸查詢多級樹形結構數據(多級菜單)

    這篇文章主要介紹了Java如何使用遞歸查詢多級樹形結構數據(多級菜單),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 基于Spring的注解@Qualifier小結

    基于Spring的注解@Qualifier小結

    這篇文章主要介紹了Spring的注解@Qualifier小結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Springboot2.x結合Mabatis3.x下Hikari連接數據庫報超時錯誤

    Springboot2.x結合Mabatis3.x下Hikari連接數據庫報超時錯誤

    本文針對Springboot2.x與Mybatis3.x結合使用時,Hikari連接數據庫出現(xiàn)超時錯誤的問題進行了深入分析,并提供了一系列有效的解決方法,感興趣的可以了解一下
    2023-11-11
  • JAVA異常處理捕獲與拋出原理解析

    JAVA異常處理捕獲與拋出原理解析

    這篇文章主要介紹了JAVA異常處理捕獲與拋出原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • java設計日歷可視化的詳細步驟記錄

    java設計日歷可視化的詳細步驟記錄

    這篇文章主要給大家介紹了關于java設計日歷可視化的相關資料,通過自定義的CircleLabel類來突出顯示今天的日期,并使用BorderLayout布局管理窗口組件,文章詳細描述了各個類和方法的設計思想和實現(xiàn)邏輯,需要的朋友可以參考下
    2024-12-12
  • java數據結構關于棧的實例應用

    java數據結構關于棧的實例應用

    大家好,本篇文章主要講的是java數據結構關于棧的實例應用,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評論