Java代碼執行順序


舉一個實例程序:

 

class HelloA {

       public HelloA(){
           System.out.println("Hello A!父類構造方法");
       }

      {        System.out.println("i'm A class.父類非靜態代碼塊");


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

     class HelloB extends HelloA {
        public HelloB(){
            System.out.println("Hello B! 構造方法");
        }
        {
            System.out.println("i'm B class.非靜態代碼塊");
        }
        static{
            System.out.println("static B 靜態代碼塊");
        }
        public static void main(String[] args) {
            System.out.println("---start---");
            new HelloB();
            new HelloB();
            System.out.println("---end---");
        }
}

 

輸出結果:

 

再來比較一段代碼,與上面幾乎如出一轍但是有一些細微的差別:

 

class A{
    public  A(){
        System.out.println("A.普通代碼塊");
    }
    {
        System.out.println("A.構造塊");
    }
    static {
        System.out.println("A.靜態塊");
    }

}
class B extends A{
    public void B(){
        System.out.println("B.普通代碼塊");
    }
    {
        System.out.println("B.構造塊");
    }
    static {
        System.out.println("B.靜態塊");
    }

}


class Test{
    public static void main(String[] args) {
        System.out.println("*******start*******");
        new B();
        new B();
        System.out.println("*******end*******");
    }
}

 

輸出結果:

不同之處在於:第二段代碼的開始菜單打印在非主類里面(沒有public修飾的類),所以靜態代碼塊並不優先於測試類(Test)里面的開始菜單執行

第二點:第二段代碼里面的子類的B方法並不是構造方法,因為它加了修飾詞void,就不成了構造方法構造方法 ,所以就不打印public void B方法里面的東西,所謂構造方法:
名字和類名一樣
沒有任何返回類型
void 是返回為空,所以不是構造方法,就算是空也不行

構造:public test(){},public test(int a){}

 

 

分析:

代碼塊定義:使用 {} 定義的一段代碼。
根據代碼塊定義的位置以及關鍵字,又可分為以下四種:
普通代碼塊 構造快 靜態塊 同步代碼塊(后續講解多線程部分再談)

普通代碼塊:定義在方法中的代碼塊

一般如果方法中代碼過長,為避免變量重名,使用普通代碼塊。(使用較少,了解概念即可)。 

 

構造塊:定義在類中的代碼塊(不加修飾符)

構造塊優先於構造方法執行,每產生一個新的對象就調用一次構造塊,構造塊可以進行簡 單的邏輯操作(在調用構造方法前) 

靜態代碼塊:使用static定義的代碼塊
根據靜態塊所在的類的不同又可分為以下兩種類型
1. 在非主類中 2. 在主類中

通過以上代碼我們可以發現:
1. 靜態塊優先於構造塊執行。 2. 無論產生多少實例化對象,靜態塊都只執行一次。 靜態塊的主要作用是為static屬性進行初始化

在主類中定義的靜態塊,優先於主方法(main)執行
總結:針對以上對代碼塊的講解,如果一些屬性需要在使用前做處理,可以考慮使用代碼塊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM