在Java中自由块的执行顺序

stephen09235

stephen09235

2016-02-19 10:49

下面这个在Java中自由块的执行顺序教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!
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--------");

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

father's free block running

father's constructor running

son's free block running

son's constructor running

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

展开更多 50%)
分享

猜你喜欢

在Java中自由块的执行顺序

编程语言 网络编程
在Java中自由块的执行顺序

在java 中执行触发器代码、创表语句

编程语言 网络编程
在java 中执行触发器代码、创表语句

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在VB中异步执行程序

编程语言 网络编程
在VB中异步执行程序

Singleton在Java中的应用

Java JAVA基础
Singleton在Java中的应用

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

在多个Word文档中自由切换

办公软件
在多个Word文档中自由切换

在JAVA中定义类的结构

编程语言 网络编程
在JAVA中定义类的结构

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Sql Server 2000 行转列的实现(横排)

Sql Server 2000 行转列的实现(横排)

背景音乐每次刷新都可以自动更换

背景音乐每次刷新都可以自动更换
下拉加载更多内容 ↓