Java中的静态初始化和非静态初始化

文章作者:Tyan
博客:noahsnail.com  |  CSDN  |  简书

1. Java中的初始化

Java与C++的一个不同之处在于,Java不仅有构造函数,还有一个“初始化块”(Initialization Block)的概念。Java中的初始化块在创建Java对象时隐式执行,并且是在构造函数之前执行。

2. 静态初始化

1
2
3
4
// 定义
static {
...
}

静态初始化块执行的优先级高于非静态初始化块,在对象装载到JVM中时执行一次,仅能初始化类成员变量,即static修饰的数据成员。

3. 非静态初始化

1
2
3
4
// 定义
{
...
}

非静态初始化块在每个对象生成时都会被执行一次,它可以初始化类的实例变量。非静态初始化块在构造函数之前执行。

4. Demo

  • Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Test {

static {
System.out.println("Run static initailization block.");
}

{
System.out.println("Run nonstatic initailization block.");
}

public Test() {
System.out.println("Run Test constructor.");
}

public static void main(String[] args) {
Test t = new Test();
}
}
  • Result
1
2
3
Run static initailization block.
Run nonstatic initailization block.
Run Test constructor.

5. 总结

从某种程度上来看,初始化块是构造器的补充,初始化块总是在构造器之前执行。初始化块是一段固定执行的代码,它不能接受任何参数。因此初始化块对同一个类的所有对象所进行的初始化处理完全相同。如果有一段初始化处理代码对所有的对象完全相同,且无需接受任何参数,就可以把这段初始化处理代码提取到初始化块中。通过把多个构造器中的相同代码提取到初始化块中定义,能更好地提高初始化代码的复用。静态初始化块是类相关的,系统将在类加载时执行静态初始化块,而不是在创建对象时才执行,因此静态初始化块总是比非静态初始化块先执行。用途:例如在JNI调用时,需要加载动态链接库,就可以在静态代码块中加载。

如果有收获,可以请我喝杯咖啡!