静态初始化块vs构造函数java

时间:2013-09-04 05:25:41

标签: java

class prog
{
    static
    {
        System.out.println("s1");
    }
    prog()
    {
        System.out.println("s2");
    }

    public static void main(String...args)
    {
        prog p = new prog();
    }
}

输出

s1
s2

根据输出,似乎静态初始化块在执行默认构造函数之前执行。

这背后的理由是什么?

4 个答案:

答案 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)

静态阻止一次执行块.. 它在类加载时执行..

为类构造函数创建对象时执行..