主方法之前的静态块执行

时间:2015-03-16 23:26:54

标签: java oop

类的静态块是否在同一类的main方法之前执行?

示例:

public class Example {

    static
    {
        System.out.println("hi");
    }

    public static void main(String[] args) {

        System.out.println("bye");

    }
}

该程序的输出是:

  

     

再见

我怀疑的是为什么输出不是:

  

再见

3 个答案:

答案 0 :(得分:2)

好的,我在命令提示符下使用-java示例运行程序时得到了答案。在后台java命令执行主线程为 - example.main() - 这类似于静态方法调用。 因此,静态块中的语句首先执行,而不是我的main方法。

答案 1 :(得分:1)

Java将在调用任何方法(或创建任何实例)之前运行类的静态初始化器。 JLS, Section 12.4.1,声明:

  

类或接口类型T将在第一次出现以下任何一个之前立即初始化:

     
      
  • T是一个类,并创建了一个T实例。

  •   
  • 调用T声明的静态方法。

  •   
  • 分配由T声明的静态字段。

  •   
  • 使用T声明的静态字段,该字段不是常量变量(§4.12.4)。

  •   
  • T是顶级类(§7.6),并且执行词汇嵌套在T(§8.1.3)中的断言语句(§14.10)。

  •   

部分初始化顺序为:

  
      
  1. 接下来,按文本顺序执行类的类变量初始值设定项和静态初始值设定项,或接口的字段初始值设定项,就好像它们是单个块一样。
  2.   

因此,首先运行静态初始化程序,然后打印“hi”;然后调用main来打印“再见”。

答案 2 :(得分:0)

只有在main()中的任何内容之前执行静态块中的内容才有意义。如果你要定义“静态PI = 3.14157;”你不喜欢在主方法中知道吗?任何其他方式都会破坏目的。

事实证明,静态项目是在加载时执行的。