国产探花免费观看_亚洲丰满少妇自慰呻吟_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-----------

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 瑞昌市| 克拉玛依市| 山东| 九寨沟县| 韩城市| 古丈县| 威信县| 柏乡县| 沽源县| 龙海市| 江陵县| 黑山县| 砚山县| 晋中市| 肃南| 卢湾区| 象州县| 汽车| 博湖县| 元氏县| 兰考县| 台江县| 教育| 阿合奇县| 邳州市| 垦利县| 宜兰市| 宜章县| 离岛区| 旌德县| 白河县| 嘉祥县| 株洲县| 东兴市| 溧阳市| 大悟县| 商河县| 师宗县| 秦安县| 左贡县| 兴宁市|