java中代碼執行順序

以前對於靜態代碼塊,構造代碼塊,普通代碼塊,以及類的初始化等代碼執行順序一直不是特別清楚,在此整理,方便複習!java

執行順序:

  • 父類 -->子類
  • 靜態屬性&靜態代碼塊 -->普通屬性&構造代碼塊-->構造方法 -->普通代碼塊(所在方法被調用才執行)

緣由分析:

靜態代碼塊:

  1. 在java中使用static關鍵字聲明的代碼塊{}。
    static {
        System.out.println("靜態代碼塊");
    }
  2. 代碼級別:成員級別
  3. ==在類加載時執行,且只執行一次==
    (對於類加載不是很清楚的小夥伴們可先看這篇博客:類加載
    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();//第一次執行,觸發了類加載
        System.out.println("=========華麗的分割線=========");
        new Parent();//第二次實例化,再也不觸發類的加載,再也不執行靜態代碼塊
    }
    }

    運行結果:
    在這裏插入圖片描述ide

構造代碼塊:

  1. 直接在類中定義且沒有加static關鍵字的代碼塊稱爲{}構造代碼塊。
    public class Test01 {
    {
        System.out.println("我是構造代碼塊");
    }
    public static void main(String[] args) {
        new Test01();
    }
    }
  2. 代碼級別:成員級別
  3. 構造代碼塊在建立對象時被調用,每次建立對象都會被調用
  4. 構造代碼塊的執行次序優先於類構造方法
class Test02{
    {
        System.out.println("我是 父類 構造代碼塊");
    }
}

public class Test01 extends Test02{

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

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

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

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

運行結果:
java中代碼執行順序測試

普通代碼塊:

  1. 在方法或語句中出現的{}就稱爲普通代碼塊。
    public void method() {
        {
            System.out.println("普通代碼塊1");
        }
        ....
    }
  2. 代碼級別:方法級別
  3. 普通代碼塊和通常的語句執行順序由他們在代碼中出現的次序決定--「先出現先執行」
class Test02{
    {
        System.out.println("我是 父類 構造代碼塊");
    }
}

public class Test01 extends Test02{

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

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

    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();//被調用纔會執行方法中的代碼塊
    }
}

運行結果:
在這裏插入圖片描述this

類的實例化:

  1. 類的實例化有三部分:屬性,構造代碼塊,構造方法
  2. 屬性的加載和構造代碼塊加載是同等級的,執行順序爲書寫順序
  3. 構造方法在前兩種方式加載完以後再執行

總結:

對象實例化時的順序:.net

1,父類的靜態成員變量和靜態代碼塊加載3d

2,子類的靜態成員變量和靜態代碼塊加載code

3,父類成員變量和構造代碼塊加載對象

4,父類的構造方法加載blog

5,子類成員變量和構造代碼塊加載圖片

6,子類的構造方法加載

知識點彙總 ,測試源碼以下:

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

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

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

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

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

public class ExplicitStatic extends Parent2 {

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

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

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

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

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

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

    int a = initA();//8

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

    int b = initB();//11

    {
        System.out.println("子類  的構造代碼塊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();

}

運行結果如圖:

!\[\](https://img-blog.csdnimg.cn/20191010233318553.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjEyNTMxMA==,size_16,color_FF

相關文章
相關標籤/搜索