什么是初始化块?
2022-08-31 08:50:24
我们可以将代码放在构造函数、方法或初始化块中。初始化块有什么用?每个java程序都必须拥有它吗?
我们可以将代码放在构造函数、方法或初始化块中。初始化块有什么用?每个java程序都必须拥有它吗?
首先,有两种类型的初始化块:
此代码应说明它们的用法以及它们的执行顺序:
public class Test {
static int staticVariable;
int nonStaticVariable;
// Static initialization block:
// Runs once (when the class is initialized)
static {
System.out.println("Static initalization.");
staticVariable = 5;
}
// Instance initialization block:
// Runs each time you instantiate an object
{
System.out.println("Instance initialization.");
nonStaticVariable = 7;
}
public Test() {
System.out.println("Constructor.");
}
public static void main(String[] args) {
new Test();
new Test();
}
}
指纹:
Static initalization.
Instance initialization.
Constructor.
Instance initialization.
Constructor.
如果要运行某些代码而不考虑使用哪个构造函数,或者要对匿名类执行某些实例初始化,则实例初始化块非常有用。
想补充一下@aioobe的答案
执行顺序:
超类的静态初始化块
类的静态初始化块
超类的实例初始化块
超类的构造函数
类的实例初始化块
类的构造函数。
要记住的几个额外的要点(第1点是重申@aioobe的答案):
静态初始化块中的代码将在类装入时执行(是的,这意味着每个类装入只有一次),在构造类的任何实例之前,在调用任何静态方法之前。
实例初始化块实际上由 Java 编译器复制到该类具有的每个构造函数中。因此,每次实例初始化块中的代码恰好在构造函数中的代码之前执行时。