class prog
{
static
{
System.out.println("s1");
}
prog()
{
System.out.println("s2");
}
public static void main(String...args)
{
prog p = new prog();
}
}
输出
s1
s2
根据输出,似乎静态初始化块在执行默认构造函数之前执行。
这背后的理由是什么?
答案 0 :(得分:26)
Static block
在上课时执行了一次&每次创建该类的实例时都会调用JVM和构造函数的初始化。
如果您更改了代码 -
public static void main(String...args){
prog p = new prog();
prog p = new prog();
}
你会得到输出 -
s1 // static block execution on class loading time
s2 // 1st Object constructor
s2 // 2nd object constructor
其中澄清了更多。
答案 1 :(得分:9)
严格来说,static initializers时会执行the class is initialized。
Class loading是一个单独的步骤,稍早发生。通常会加载一个类然后立即初始化,因此时间在大多数情况下并不重要。但 可以在不初始化的情况下加载一个类(例如使用the three-argument Class.forName()
variant)。
无论你采用哪种方式:一个类总是在你创建它的实例时完全初始化,所以static
块已经在那里运行了时间。
答案 2 :(得分:5)
当创建新实例时,类加载器和构造函数加载类时,正确进行静态初始化
答案 3 :(得分:0)
静态阻止一次执行块.. 它在类加载时执行..
为类构造函数创建对象时执行..