java中静态块与main方法的区别

时间:2014-05-19 13:43:48

标签: java

我的问题很简单,为什么我们需要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

}

}

4 个答案:

答案 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);

}

这有时你需要担心静态初始化,但这意味着你需要在每个程序中担心它。