public class MyClass{
static{
System.out.println("Weired Behaviour");
}
}
//如果使用 java MyClass 从命令行调用(什么和为什么)将是输出?
输出将是:
Weired Behaviour
Exception in thread "main" java.lang.NoSuchMethodError: main
实际上并不奇怪。以下是 JVM 中发生的一系列活动。
当您尝试调用应用程序时,将加载主类。类的静态块在 JVM 加载类时执行 - 静态块是类初始化器的一种,仅在类加载到内存中时才被调用。
类加载完成后,JVM 会尝试找出入口点——main 方法。由于没有找到 main 方法,所以抛出异常。
假设你实际上有这样的东西,这样它就不会对你大喊大叫:
public class MyClass{
static{
System.out.println("Weird Behavior");
}
public static void main(String[] args){}
}
您将看到输出:
Weird Behavior
这是因为类中的静态块在 JVM 加载类时被执行。
Static Initalizer 是在 JVM 加载类时执行的块,在创建类的实例之前,甚至在初始化任何静态方法或变量之前。
这将导致打印语句“Weired Behaviour”
,但随后它会尝试找到“main”方法的入口点,然后它会抛出异常。Exception in thread "main"