java中代碼執(zhí)行順序

之前對于靜態(tài)代碼塊,構(gòu)造代碼塊,普通代碼塊,以及類的初始化等代碼執(zhí)行順序一直不是特別清楚,在此整理,方便復習!

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于做網(wǎng)站、成都網(wǎng)站制作、雙流網(wǎng)絡推廣、重慶小程序開發(fā)公司、雙流網(wǎng)絡營銷、雙流企業(yè)策劃、雙流品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供雙流建站搭建服務,24小時服務熱線:18980820575,官方網(wǎng)址:muchs.cn

執(zhí)行順序:

  • 父類 -->子類
  • 靜態(tài)屬性&靜態(tài)代碼塊 -->普通屬性&構(gòu)造代碼塊-->構(gòu)造方法 -->普通代碼塊(所在方法被調(diào)用才執(zhí)行)

原因分析:

靜態(tài)代碼塊:

  1. 在java中使用static關(guān)鍵字聲明的代碼塊{}。
    static {
        System.out.println("靜態(tài)代碼塊");
    }
  2. 代碼級別:成員級別
  3. ==在類加載時執(zhí)行,且只執(zhí)行一次==
    (對于類加載不是很清楚的小伙伴們可先看這篇博客:類加載)
    class Parent {
    static {
        System.out.println("A");
    }
    Parent(){
        System.out.println("sdfsaf");
    }
    static {
        System.out.println("B");
    }
    }
    public class ExplicitStatic  {
    public static void main(String[] args) {
        new Parent();//第一次執(zhí)行,觸發(fā)了類加載
        System.out.println("=========華麗的分割線=========");
        new Parent();//第二次實例化,不再觸發(fā)類的加載,不再執(zhí)行靜態(tài)代碼塊
    }
    }

    運行結(jié)果:
    java中代碼執(zhí)行順序

構(gòu)造代碼塊:

  1. 直接在類中定義且沒有加static關(guān)鍵字的代碼塊稱為{}構(gòu)造代碼塊。
    public class Test01 {
    {
        System.out.println("我是構(gòu)造代碼塊");
    }
    public static void main(String[] args) {
        new Test01();
    }
    }
  2. 代碼級別:成員級別
  3. 構(gòu)造代碼塊在創(chuàng)建對象時被調(diào)用,每次創(chuàng)建對象都會被調(diào)用
  4. 構(gòu)造代碼塊的執(zhí)行次序優(yōu)先于類構(gòu)造方法
class Test02{
    {
        System.out.println("我是 父類 構(gòu)造代碼塊");
    }
}

public class Test01 extends Test02{

    {
        System.out.println("我是 子類 構(gòu)造代碼塊1");
    }

    Test01(){
        System.out.println("我是無參構(gòu)造方法");
    }
    Test01(int v){
        System.out.println("我是有參構(gòu)造方法");
    }

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

    {
        System.out.println("我是 子類 構(gòu)造代碼塊2");
    }
    public static void main(String[] args) {
        new Test01();
        System.out.println("===================華麗的分割線===================");
        new Test01(6);//每次創(chuàng)建對象都會執(zhí)行構(gòu)造代碼塊
    }
}

運行結(jié)果:
java中代碼執(zhí)行順序

普通代碼塊:

  1. 在方法或語句中出現(xiàn)的{}就稱為普通代碼塊。
    public void method() {
        {
            System.out.println("普通代碼塊1");
        }
        ....
    }
  2. 代碼級別:方法級別
  3. 普通代碼塊和一般的語句執(zhí)行順序由他們在代碼中出現(xiàn)的次序決定--“先出現(xiàn)先執(zhí)行”
class Test02{
    {
        System.out.println("我是 父類 構(gòu)造代碼塊");
    }
}

public class Test01 extends Test02{

    {
        System.out.println("我是 子類 構(gòu)造代碼塊");
    }

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

    public void method(){
        {
            System.out.println("普通代碼塊1");
        }

        System.out.println("普通方法體");

        {
            System.out.println("普通代碼塊2");
        }
    }
    public static void main(String[] args) {
        new Test01();
        System.out.println("===================華麗的分割線===================");
        new Test01().method();//被調(diào)用才會執(zhí)行方法中的代碼塊
    }
}

運行結(jié)果:
java中代碼執(zhí)行順序

類的實例化:

  1. 類的實例化有三部分:屬性,構(gòu)造代碼塊,構(gòu)造方法
  2. 屬性的加載和構(gòu)造代碼塊加載是同等級的,執(zhí)行順序為書寫順序
  3. 構(gòu)造方法在前兩種方式加載完之后再執(zhí)行

總結(jié):

對象實例化時的順序:

1,父類的靜態(tài)成員變量和靜態(tài)代碼塊加載

2,子類的靜態(tài)成員變量和靜態(tài)代碼塊加載

3,父類成員變量和構(gòu)造代碼塊加載

4,父類的構(gòu)造方法加載

5,子類成員變量和構(gòu)造代碼塊加載

6,子類的構(gòu)造方法加載

知識點匯總 ,測試源碼如下:

class Parent2 {
    {
        System.out.println("父類  構(gòu)造代碼塊1");//5
    }

    Parent2() {
        System.out.println("父類  的無參構(gòu)造方法");//7
    }

    static {
        System.out.println("父類  的靜態(tài)代碼塊1");//1
    }

    {
        System.out.println("父類  構(gòu)造代碼塊2");//6
    }

    static {
        System.out.println("父類  的靜態(tài)代碼塊2");//2
    }
}

public class ExplicitStatic extends Parent2 {

    static {
        System.out.println("子類  的靜態(tài)代碼塊1");//3
    }

    ExplicitStatic() {//15
        super();//可省略
        System.out.println("子類  無參構(gòu)造方法");//16
    }

    ExplicitStatic(int v) {//14
        this();//即 執(zhí)行15
        System.out.println("子類  有參構(gòu)造方法");//17
    }

    private int initA() {
        System.out.println("子類  的屬性初始化調(diào)用 普通方法A");//9
        return 0;
    }

    static {
        System.out.println("子類  的靜態(tài)代碼塊2");//4
    }

    private int initB() {
        System.out.println("子類  的屬性初始化調(diào)用 普通方法B");//12
        return 0;
    }

    int a = initA();//8

    {
        System.out.println("子類  的構(gòu)造代碼塊1");//10
    }

    int b = initB();//11

    {
        System.out.println("子類  的構(gòu)造代碼塊2");//13
    }

    public void method() {
        {
            System.out.println("子類  的普通代碼塊1");
        }
        System.out.println("子類  的普通方法method");
        {
            System.out.println("子類  的普通代碼塊2");
        }
    }

    public static void main(String[] args) {
        new ExplicitStatic(100);
        System.out.println("=================");
        new ExplicitStatic().method();

}

運行結(jié)果如圖:

java中代碼執(zhí)行順序

文章名稱:java中代碼執(zhí)行順序
文章出自:http://muchs.cn/article44/ispjee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計定制網(wǎng)站、軟件開發(fā)、手機網(wǎng)站建設(shè)、外貿(mào)建站、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站