问题
我们可以将代码放在构造函数或方法或初始化块中。初始化块有什么用?每个java程序都必须拥有它吗?
#1 热门回答(145 赞)
实例初始化块,和
静态初始化块。
此代码应说明它们的使用以及它们的执行顺序:
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.
如果你想要运行某些代码而不管使用哪个构造函数,或者你想为匿名类执行某些实例初始化,则实例itialization块非常有用。
#2 热门回答(82 赞)
想加入@ aioobe的答案
执行顺序:
超类的静态初始化块
类的静态初始化块
超类的实例初始化块
超类的构造者
类的实例初始化块
类的构造函数。
还要记住几点要点(第1点是@ aioobe的回答重申):
静态初始化块中的代码将在类加载时执行(是的,这意味着每个类加载一次),在构造类的任何实例之前和调用任何静态方法之前。
实例初始化块实际上由Java编译器复制到该类具有的每个构造函数中。因此,每次实例初始化块中的代码都在构造函数中的代码之前执行。
#3 热门回答(5 赞)
很好的答案由aioobe增加几点
public class StaticTest extends parent {
static {
System.out.println("inside satic block");
}
StaticTest() {
System.out.println("inside constructor of child");
}
{
System.out.println("inside initialization block");
}
public static void main(String[] args) {
new StaticTest();
new StaticTest();
System.out.println("inside main");
}
}
class parent {
static {
System.out.println("inside parent Static block");
}
{
System.out.println("inside parent initialisation block");
}
parent() {
System.out.println("inside parent constructor");
}
}
这给了
inside parent Static block
inside satic block
inside parent initialisation block
inside parent constructor
inside initialization block
inside constructor of child
inside parent initialisation block
inside parent constructor
inside initialization block
inside constructor of child
inside main
它表示明显但似乎更清晰。