4

Horstmann 在 Core Java 第 7 版中写道,可以在没有 main 方法的情况下显示 Hello, world。它是这样完成的:

public class Hello{
    static{
        System.out.println("Hello, world");
    }
}

他说首先你好,世界将被写入。只有这样,您才会收到一条错误消息。

我用

java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

我无法对此进行建模。它已经修复了吗?

4

2 回答 2

6

Java 7在加载类之前会查找 main 方法。这是与以前的 java 版本相比的行为更改,因此您的static块没有执行。在以前的版本中,行为是 JRE 用于在加载类后和执行静态块后查找 main 方法。

因此,如果您在 java 7 之前的任何版本上运行代码,您将看到该static块执行。

您正在阅读的书可能不是为 java 7 编写的,但您用于执行示例的 jdk&jre 是版本 7。

一个建议:作为一种良好的阅读习惯,您应该尝试在与书中指定的相同版本上运行书籍样本以避免混淆。尽管在这种情况下,您的困惑会导致您学习有关 java 7 的新知识。

于 2013-08-17T10:45:46.277 回答
2

在 Java 7 之前,JVM 用于在搜索 main() 方法之前加载类。

public class Hello{
    static{
        System.out.println("Hello, world");
    }
} 

因此,当您按类执行此操作时,java Hello将首先加载并Hello, world打印(加载类时执行静态方法/块,并在引用类时加载类)。然后 JVM 将在 Hello 类中搜索 main() 方法,并会抛出一个错误,因为它不存在。但是,这在 java 7 中已修复。因此,如果您使用的是 java 7,那么您将直接收到错误消息。

于 2013-08-17T10:50:50.203 回答