我的问题很简单,为什么我们需要main()
方法? jvm调用public static void main()
方法启动应用程序。以及静态块也在类加载后执行。如果没有main()
程序会提供main method not found exception
,但您可以通过在语句后的静态块中添加System.exit(0)
行来避免此错误,然后是main()
方法的重点?如果没有主要方法,是否有任何功能?
class A{
public static void main(String ar[]){
.....
....
}
// VS
static{
....
...
System.exit(0); // to avoid main method not found error
}
}
答案 0 :(得分:3)
当然你失去了一些功能。你是如何获得命令行参数的?可能有一些聪明的伎俩,但没有必要为它做一些破解。
在所有应用程序中使用标准main
方法的原因是,JVM始终知道在项目中查找块以开始执行的位置。您必须在某处标准化。
答案 1 :(得分:3)
在加载类之后,未执行static
块。在加载类时执行。在静态块退出之前,该类尚未完全构造。
--------编辑----------
@sky,尝试运行此程序,看看会发生什么:
class Foo {
static String name = "Michael";
static {
Thread t = new Thread(new Bar());
t.start();
try {
Thread.sleep(30000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
}
}
class Bar implements Runnable {
public void run() {
System.out.println(Foo.name);
}
}
答案 2 :(得分:0)
嗯,我没有过多考虑过场景中的问题,但只是通过查看它的表面,如果没有 main()方法,你至少不能拥有命令行参数。
答案 3 :(得分:0)
如前所述,存在命令行参数不可能或不必要地难以访问的问题。
还有一个程序在不同类中有多个主电源的问题。有时我会创建一个单独的main方法来对新类进行初始测试。如果我必须将它放在静态初始化块中,那么每当加载该类时,程序的每个预期起始点都会运行;这将是一个没有任何好处的新bug来源。
它还增加了一个类初始化的复杂性,即静态初始化块之下的任何值都将具有其默认值而不是其设置值。例如,以下打印0。
static{
HackedStaticBlock h=new HackedStaticBlock();
}
static int badNumber=17;
public HackedStaticBlock() {
System.out.println(badNumber);
}
这有时你需要担心静态初始化,但这意味着你需要在每个程序中担心它。