静态块是否在没有main方法的情况下执行?

Vij*_*raj 21 java

论坛上有一个问题,

静态块甚至在应用程序中没有主方法执行.
1.正确
2.错误

我已回答了问题,2. False并在我的机器上尝试了以下代码.它没有执行任何操作也没有显示任何错误.

public class StaticBlockDemo {
    static {
        System.out.println("Hello World");
    }
}
Run Code Online (Sandbox Code Playgroud)

那么正确的答案是什么?顺便说一下,我正在使用Java 7.

ars*_*jii 36

如果你System.exit(0)static-block 的末尾添加一个,它将在Java 6及更低版本中运行时没有错误(没有有效的main!).这是因为在搜索有效方法之前static执行了块,因此如果在静态块结束时退出程序,则不会收到任何错误.main

但是, Java 7中更改了此行为; 现在你必须包括一个明确的main,即使它可能永远不会到达.

在Java 7中,问题的答案是错误的,但在Java 6及以下版本中答案确实如此.


public class Test {
    static {
        System.out.println("Hello World");
        System.exit(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

Java 6:

Hello World

Java 7:

Error: Main method not found in class Test, please define the main method as:
   public static void main(String[] args)

  • 为什么"技巧"问题很可怕的完美例子......这些技巧经常会随着时间而改变. (10认同)
  • 如果没有加载类**,Java7如何知道类是否有`main()`方法**? (3认同)
  • @GaborSch:我认为它将加载该类,但是在加载静态内容之前检查主方法(假设它是bootstrap类,这是我的猜测) (2认同)

Mik*_*uel 5

静态块在初始化类时执行。通常,main该类将导致bootstrap类的初始化,但是还有其他方法来引导程序,例如通过VM的本机嵌入API

调用static main类的方法会导致其初始化,但是其他很多事情也是如此:

  1. 创建该类的实例,
  2. 调用任何其他静态方法,
  3. 读取一个静态字段(该字段不是final或具有除原始类型或String以外的类型)。

有关更多详细信息,请参见JLS第12.4章

下面显示了此操作

public class Foo {
  static { System.out.println("Foo initialized"); }

  public static void main(String... argv) {
    Initialized.callingThisCausesClassInitialization();
  }

  static class Initialized {
    static { System.out.println("Initialized initialized"); }
    static void callingThisCausesClassInitialization() {}
  }

  static class NotInitialized {
    static { System.out.println("NotInitialized initialized"); }
    static void callingThisCausesClassInitialization() {}
  }
}
Run Code Online (Sandbox Code Playgroud)

运行foo将打印

Foo initialized
Initialized initialized
Run Code Online (Sandbox Code Playgroud)

它不会打印

NotInitialized initialized
Run Code Online (Sandbox Code Playgroud)

因为在该程序的执行过程中没有执行任何操作导致其初始化。

NotInitialized上面那样,您的类似乎具有这种行为,因为它从未使用过。