【问题标题】:static initialization block vs constructor java [duplicate]静态初始化块与构造函数java [重复]
【发布时间】:2025-12-05 07:20:04
【问题描述】:
class prog
{
    static
    {
        System.out.println("s1");
    }
    prog()
    {
        System.out.println("s2");
    }

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

输出是

s1
s2

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

这背后的原理是什么?

【问题讨论】:

    标签: java


    【解决方案1】:

    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
    

    这说明了更多。

    【讨论】:

      【解决方案2】:

      严格来说,static initializers 被执行,而the class is initialized

      Class loading 是一个单独的步骤,发生的时间稍早。通常一个类被加载然后立即初始化,所以大部分时间时间并不重要。但是可以加载一个类而不初始化它(例如通过使用the three-argument Class.forName() variant)。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】: