国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

在Java中自由塊的執行順序

2019-11-26 16:12:41
字體:
來源:轉載
供稿:網友
  • 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-----------

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 陵水| 阳春市| 大厂| 富川| 鹤庆县| 洱源县| 郓城县| 隆化县| 通许县| 克拉玛依市| 都安| 磐安县| 永州市| 宁远县| 恩施市| 鹤山市| 会同县| 本溪| 株洲市| 嘉义市| 衢州市| 博白县| 涞水县| 皋兰县| 台州市| 石棉县| 双江| 张家口市| 德清县| 泾源县| 锡林郭勒盟| 金沙县| 迁西县| 綦江县| 长寿区| 社旗县| 油尖旺区| 神农架林区| 平谷区| 凤翔县| 清水河县|