我已经编写了一个包含一个静态块的简单类
class Hello
{
static {
System.out.println("Hello");
System.exit(0);
}
}当我使用jdk1.5运行它时,会执行静态块
C:\apps\Java\jdk1.5.0_21\bin>javac Hello.java
C:\apps\Java\jdk1.5.0_21\bin>
C:\apps\Java\jdk1.5.0_21\bin>
C:\apps\Java\jdk1.5.0_21\bin>
C:\apps\Java\jdk1.5.0_21\bin>java Hello
Hello但是当我使用jdk1.7运行它时,我得到了以下错误
C:\Program Files (x86)\Java\jdk1.7.0_02\bin>
C:\Program Files (x86)\Java\jdk1.7.0_02\bin>javac Hello.java
C:\Program Files (x86)\Java\jdk1.7.0_02\bin>java Hello
Error: Main method not found in class Hello, please define the main method as:
public static void main(String[] args)有人知道JDK 5和JDK 7中的这种行为变化吗?
提前感谢!!
发布于 2013-07-06 14:52:00
Java7在装入类之前查找main方法。这是与以前的java版本相比的行为变化,因此您的静态代码块不会执行。在以前的版本中,的行为是在装入类和执行静态块之后查找main方法。
发布于 2013-07-06 14:52:40
是的,在jdk7中。静态块不是首先执行的。它首先查找应用程序中的入口点。
因此,它首先检查public static void main(String a[]),如果此方法不存在,则不会执行静态块。
发布于 2013-07-06 15:00:01
通过JLS 12.1
Java Virtual Machine通过调用某个指定类的方法main开始执行,并向其传递一个参数,该参数是一个字符串数组。在本规范的示例中,第一个类通常称为Test。
最初尝试执行类Test的方法main时,发现没有加载Test类-也就是说,Java虚拟机当前不包含该类的二进制表示。然后,虚拟机使用一个类加载器来尝试找到这样的二进制表示。
Java7查找public static main(String[] args)方法,这是应用程序的入口点,然后加载类,这与Java6加载类然后查找main方法不同。
https://stackoverflow.com/questions/17500469
复制相似问题