文章作者:Tyan
博客:noahsnail.com | CSDN | 简书
1. Java中的初始化
Java与C++的一个不同之处在于,Java不仅有构造函数,还有一个“初始化块”(Initialization Block)的概念。Java中的初始化块在创建Java对象时隐式执行,并且是在构造函数之前执行。
2. 静态初始化
// 定义
static {
...
}
静态初始化块执行的优先级高于非静态初始化块,在对象装载到JVM中时执行一次,仅能初始化类成员变量,即static修饰的数据成员。
3. 非静态初始化
// 定义
{
...
}
非静态初始化块在每个对象生成时都会被执行一次,它可以初始化类的实例变量。非静态初始化块在构造函数之前执行。
4. Demo
- Example
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
Run static initailization block.
Run nonstatic initailization block.
Run Test constructor.
5. 总结
从某种程度上来看,初始化块是构造器的补充,初始化块总是在构造器之前执行。初始化块是一段固定执行的代码,它不能接受任何参数。因此初始化块对同一个类的所有对象所进行的初始化处理完全相同。如果有一段初始化处理代码对所有的对象完全相同,且无需接受任何参数,就可以把这段初始化处理代码提取到初始化块中。通过把多个构造器中的相同代码提取到初始化块中定义,能更好地提高初始化代码的复用。静态初始化块是类相关的,系统将在类加载时执行静态初始化块,而不是在创建对象时才执行,因此静态初始化块总是比非静态初始化块先执行。用途:例如在JNI调用时,需要加载动态链接库,就可以在静态代码块中加载。