Java中静态代码块、非静态代码块以及构造函数的初始化顺序

时间:2021-11-17 19:29:07

在Java中有静态代码块和非静态代码块两种初始化的块,都是定义在类中,都需要用“{}”包起来
如:

    /**
* 非静态初始块
*/

{
System.out.println("非静态初始块在运行!!!");
}
/**
* 静态初始块
*/

static {
System.out.println("静态初始在运行!!!");
}

静态代码块前面比非静态的代码块多了一个“static”关键字

静态代码块

随着类的加载而运行,且只执行一次,不管该类被实例化过几次,只有在类初次加载的时候运行一次
实用:一般需要某些加载某些配置文件之类的代码都可以放在静态代码块中

非静态代码块

建立对象的时候会执行,不像静态代码块只执行一次,非静态代码块会随着类的实例化执行,只要实例化一个对象,就会执行一次非静态代码块,它比构造函数先执行。
同一个类中的多个非静态代码块按照在类中的顺序依次执行,同理静态代码块同样是按照顺序执行的。
实用:一般讲某些构造函数共有的部分放入非静态代码块中

初始化顺序:静态代码块>非静态代码块>构造函数
在同一个类中如果有多个静态和非静态代码块,会先按照静态代码块的上下顺序依次执行,之后是非静态,最后是构造函数。

最后附上我的测试代码

public class InitClassTest {
/**
* 非静态初始块
*/

{
System.out.println("非静态初始块在运行!!!");
}

/**
* 静态初始块
*/

static {
System.out.println("静态初始在运行!!!");
}

/**
* 测试静态初始块是否按顺序执行
*/

static {
System.out.println("测试静态初始块是否按顺序执行!!!");
}


/**
* 构造方法
*/

public InitClassTest() {
System.out.println("构造方法在运行!!!");
}


/**
* 第二个非静态初始块
*/

{
System.out.println("第二个非静态初始块在运行!!!");
}


public void printLog(){
System.out.println("测试");
}

public static void main(String[] args) {
InitClassTest test = new InitClassTest();
//test.printLog();
for (int i = 0; i < 5; i++) {
test = new InitClassTest();
}
}
}