java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java中自由块的执行顺序

在Java中自由块的执行顺序

作者:

java中的自由块分为静态的自由块和非静态的自由块。非静态自由块的执行时间是:在执行构造函数之前。静态自由块的执行时间是:class文件加载时执行。

下面通过例子来说明:

父类

复制代码 代码如下:

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-----------

 

您可能感兴趣的文章:
阅读全文