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

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

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

前言

先說總結(jié):

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

在這里插入圖片描述

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

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

public HelloA(){//構(gòu)造函數(shù)
}

關(guān)于構(gòu)造函數(shù),以下幾點要注意:

  • 對象一建立,就會調(diào)用與之相應(yīng)的構(gòu)造函數(shù),也就是說,不建立對象,構(gòu)造函數(shù)時不會運(yùn)行的。
  • 構(gòu)造函數(shù)的作用是用于給對象進(jìn)行初始化。
  • 一個對象建立,構(gòu)造函數(shù)只運(yùn)行一次,而一般方法可以被該對象調(diào)用多次。

構(gòu)造代碼塊

{//構(gòu)造代碼塊    
}

關(guān)于構(gòu)造代碼塊,以下幾點要注意:

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

靜態(tài)代碼塊

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

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

  • 它是隨著類的加載而執(zhí)行,只執(zhí)行一次,并優(yōu)先于主函數(shù)。具體說,靜態(tài)代碼塊是由類調(diào)用的。類調(diào)用時,先執(zhí)行靜態(tài)代碼塊,然后才執(zhí)行主函數(shù)的。
  • 靜態(tài)代碼塊其實就是給類初始化的,而構(gòu)造代碼塊是給對象初始化的。
  • 靜態(tài)代碼塊中的變量是局部變量,與普通函數(shù)中的局部變量性質(zhì)沒有區(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(){//構(gòu)造函數(shù)
        System.out.println("A的構(gòu)造函數(shù)");    
    }
    {//構(gòu)造代碼塊
        System.out.println("A的構(gòu)造代碼塊");    
    }
    static {//靜態(tài)代碼塊
        System.out.println("A的靜態(tài)代碼塊");        
    }
    public static void main(String[] args) {
    }
}
// A的靜態(tài)代碼塊
public class HelloA {
    public HelloA(){//構(gòu)造函數(shù)
        System.out.println("A的構(gòu)造函數(shù)");    
    }
    {//構(gòu)造代碼塊
        System.out.println("A的構(gòu)造代碼塊");    
    }
    static {//靜態(tài)代碼塊
        System.out.println("A的靜態(tài)代碼塊");        
    }
    public static void main(String[] args) {
        HelloA a=new HelloA();    
    }
}
// A的靜態(tài)代碼塊
// A的構(gòu)造代碼塊
// A的構(gòu)造函數(shù)
public class HelloA {
    public HelloA(){//構(gòu)造函數(shù)
        System.out.println("A的構(gòu)造函數(shù)");    
    }
    {//構(gòu)造代碼塊
        System.out.println("A的構(gòu)造代碼塊");    
    }
    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的構(gòu)造代碼塊
// A的構(gòu)造函數(shù)
// A的構(gòu)造代碼塊
// A的構(gòu)造函數(shù)

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

  • 執(zhí)行靜態(tài)代碼塊
  • 執(zhí)行構(gòu)造代碼塊
  • 執(zhí)行構(gòu)造函數(shù)

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

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( "初始化塊" );
    }
        /* 構(gòu)造器 */
    public InitialOrderTest(){
        System.out.println( "構(gòu)造器" );
    }
    public static void main( String[] args ){
        new InitialOrderTest();
    }
}
// 靜態(tài)變量
// 靜態(tài)初始化塊
// 變量
// 初始化塊
// 構(gòu)造器

對于繼承情況

public class HelloA {
    public HelloA(){//構(gòu)造函數(shù)
        System.out.println("A的構(gòu)造函數(shù)");    
    }
    {//構(gòu)造代碼塊
        System.out.println("A的構(gòu)造代碼塊");    
    }
    static {//靜態(tài)代碼塊
        System.out.println("A的靜態(tài)代碼塊");        
    }
}
public class HelloB extends HelloA{
    public HelloB(){//構(gòu)造函數(shù)
        System.out.println("B的構(gòu)造函數(shù)");    
    }
    {//構(gòu)造代碼塊
        System.out.println("B的構(gòu)造代碼塊");    
    }
    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的構(gòu)造代碼塊
// A的構(gòu)造函數(shù)
// B的構(gòu)造代碼塊
// B的構(gòu)造函數(shù)

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

  • 執(zhí)行父類的靜態(tài)代碼塊,并初始化父類靜態(tài)成員變量
  • 執(zhí)行子類的靜態(tài)代碼塊,并初始化子類靜態(tài)成員變量
  • 執(zhí)行父類的構(gòu)造代碼塊,執(zhí)行父類的構(gòu)造函數(shù),并初始化父類普通成員變量
  • 執(zhí)行子類的構(gòu)造代碼塊, 執(zhí)行子類的構(gòu)造函數(shù),并初始化子類普通成員變量
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( "父類--初始化塊" );
    }
        /* 構(gòu)造器 */
    public Parent(){
        System.out.println( "父類--構(gòu)造器" );
        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( "子類--初始化塊" );
    }
       /* 構(gòu)造器 */
    public SubClass(){
        System.out.println( "子類--構(gòu)造器" );
        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方法
// 父類--變量
// 父類--初始化塊
// 父類--構(gòu)造器
// i=9, j=0
// 子類--變量
// 子類--初始化塊
// 子類--構(gòu)造器
// i=9,j=20

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

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

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

相關(guān)文章

最新評論