程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 在Java中自由塊的執行順序

在Java中自由塊的執行順序

編輯:JAVA編程入門知識
  • java中的自由塊分為靜態的自由塊和非靜態的自由塊。
  • 非靜態自由塊的執行時間是:在執行構造函數之前。
  • 靜態自由塊的執行時間是:class文件加載時執行。
  • 非靜態自由塊可以多次執行,只要初始化一個對象就會執行,但是靜態自由塊只會在類裝載的時候執行一次,一般用來初始化類的靜態變量的值。
  • 每次初始化一個對象,都會導致一次非靜態塊的執行。
  • 如果涉及到繼承,則是:首先執行父類的非靜態塊,然後是父類的構造函數,接著是自己的自由塊,最後是自己的構造函數。
  • 靜態塊的執行時機是在class文件裝載的時候,class文件只會裝載一次,因此靜態塊只會執行一次,後面再使用這個類時,不會再執行靜態塊。 
  • 靜態塊的執行時機是在class裝載後的初始化階段。如果采用ClassLoader的loadclass來僅僅裝 載類而不初始化,是不會觸發靜態塊的執行的。采用Class的forname(String)是采用了默認的initialize為true的情況,也就 是初始化了。如果使用forname(String name,boolean initialize, ClassLoader loader),設置initialize為false,則不會執行靜態塊。
  • 在執行class裝載後的初始化階段包括:運行<clinit>方法,這個方法中就是類變量的初始化語句和靜態自由塊語句。這個方法是由java的編譯器收集信息後生成的,不能顯示的調用。

下面通過例子來說明:

父類

代碼如下:

father.java

public class father {

    static{//靜態塊
       System.out.println("father'sSTATIC free block running");
    }

    {//非靜態塊
 System.out.println("father'sfree block running");
    }

    public father(){

       System.out.println("father'sconstructor running");

    }
}

子類

代碼如下:

son.java
public class son extends father{
    static{//靜態塊
       System.out.println("son'sSTATIC free block running");
    }

    {//非靜態塊
       System.out.println("son's freeblock running");
    }

    public son() {
       // TODO Auto-generated constructor stub
       System.out.println("son'sconstructor running");
    }
}

主函數所在類

代碼如下:

test.java

public class test{

      public static void main(String[] args) {

       Class f;

       try {

           System.out.println("--------beforeload father--------");

           f=Class.forName("freeblock.father");

           System.out.println("--------afterload father---------");        

           System.out.println("--------beforeinitial father object--------");

           f.newInstance();

           System.out.println("--------afterinitial father object--------");

       } catch (ClassNotFoundException e) {

           e.printStackTrace();

       } catch (InstantiationException e) {
           e.printStackTrace();

       } catch (IllegalAccessException e) {

           e.printStackTrace();
       }     
       Class s;

       try {

           System.out.println("-------beforeload son--------");

           s=Class.forName("freeblock.son");

           System.out.println("--------afterload son-------");

           System.out.println("--------beforeinitial son object----------");

           s.newInstance();

           System.out.println("--------afterinitial son object-----------");

       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       } catch (InstantiationException e) {
           e.printStackTrace();
       } catch (IllegalAccessException e) {
           e.printStackTrace();
       }
    }
}

執行結果:

--------before loadfather--------

father's STATIC free blockrunning

--------after loadfather---------

--------before initial fatherobject--------

father's free block running

father's constructor running

--------after initial fatherobject--------

-------before load son--------

son's STATIC free block running

--------after load son-------

--------before initial sonobject----------

father's free block running

father's constructor running

son's free block running

son's constructor running

--------after initial son object-----------

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved