6
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

4 回答 4

34

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

这说明了更多。

于 2013-09-04T05:27:30.790 回答
9

严格来说,静态初始化器是在类被初始化时执行的。

类加载是一个单独的步骤,发生的时间稍早。通常一个类被加载然后立即初始化,所以大部分时间时间并不重要。但是可以在不初始化情况下加载一个类(例如通过使用三参数Class.forName()变体)。

无论您采用哪种方式处理它:类总是在您创建它的实例时完全初始化,因此该static块在那时已经运行。

于 2013-09-04T05:38:56.093 回答
6

这是正确的静态初始化是在类加载器和构造函数加载类时在创建新实例时完成的

于 2013-09-04T05:26:40.727 回答
0

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

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

于 2013-09-04T05:29:00.967 回答