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

java中静态块与主方法的区别,java,Java,我的问题很简单,为什么我们需要main()方法?。jvm调用公共静态void main()方法来启动应用程序。以及加载类后执行的静态块。如果不使用main()程序将出现main方法未找到异常,但您可以通过添加System来避免此错误。在语句后的静态块退出(0)行,然后main()方法有什么意义?。如果没有main方法,是否有任何功能不可用 class A{ public static void main(String ar[]){ ..... .... } // VS static{ ..

我的问题很简单,为什么我们需要
main()
方法?。jvm调用公共静态void main()方法来启动应用程序。以及加载类后执行的静态块。如果不使用
main()
程序将出现
main方法未找到异常
,但您可以通过添加
System来避免此错误。在语句后的静态块退出(0)
行,然后
main()
方法有什么意义?。如果没有main方法,是否有任何功能不可用

class A{

public static void main(String ar[]){
.....
....
}

// VS

static{
....
...

System.exit(0);  // to avoid main method not found error

}

}

当然你会失去一些功能。如何获取命令行参数?也许有一些聪明的技巧可以做到这一点,但没有必要做一些黑客


在所有应用程序中使用标准的
main
方法的原因是,JVM总是知道在项目中从何处查找块以开始执行。你必须在某个地方将其标准化。

当然你会失去一些功能。如何获取命令行参数?也许有一些聪明的技巧可以做到这一点,但没有必要做一些黑客


在所有应用程序中使用标准的
main
方法的原因是,JVM总是知道在项目中从何处查找块以开始执行。您必须在某个地方将其标准化。

好吧,我没有对场景中的问题进行过太多思考,但是仅仅从表面上看,如果没有main()命令,您至少不能有命令行参数方法。

我没有仔细考虑场景中的问题,但是仅仅从表面上看,如果没有main()方法,至少不能有命令行参数。

类加载后不会执行
静态
块。它是在加载类时执行的。在静态块退出之前,类不会完全构造

--------编辑----------

@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);
    }
}

加载类后,
静态
块不会执行。它是在加载类时执行的。在静态块退出之前,类不会完全构造

--------编辑----------

@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);
    }
}

如前所述,存在命令行参数不可能访问或不必要地难以访问的问题

还有一个问题是,在不同的类别中,有多个电源的程序。有时我会创建一个单独的main方法来对一个新类进行初始测试。如果我必须把它放在静态初始化块中,那么每当加载该类时,程序的每个预定开始点都将运行;这将是一个毫无益处的新的bug来源

它还增加了类初始化的另一个复杂性,即静态初始化块下面的任何内容都将具有其默认值,而不是其设置值。例如,以下打印0

static{
    HackedStaticBlock h=new HackedStaticBlock();
}
static int badNumber=17;

public HackedStaticBlock() {
    System.out.println(badNumber);

}

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

如前所述,存在命令行参数无法访问或不必要地难以访问的问题

还有一个问题是,在不同的类别中,有多个电源的程序。有时我会创建一个单独的main方法来对一个新类进行初始测试。如果我必须把它放在静态初始化块中,那么每当加载该类时,程序的每个预定开始点都将运行;这将是一个毫无益处的新的bug来源

它还增加了类初始化的另一个复杂性,即静态初始化块下面的任何内容都将具有其默认值,而不是其设置值。例如,以下打印0

static{
    HackedStaticBlock h=new HackedStaticBlock();
}
static int badNumber=17;

public HackedStaticBlock() {
    System.out.println(badNumber);

}

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

避免异常的唯一原因是您告诉JVM在完成查找
main()
之前退出。另外,我有点怀疑您是否能够在类加载阶段完成所有工作……您还使带有被黑客攻击的静态块(class
A
)的类无法运行。在它完成初始化之前,我会非常怀疑使用它的任何实例。当去掉主方法时,很多事情都会变得更加困难。你看到了什么好处?我不知道该问到哪里,但我想知道是否有可能构造一个静态初始值设定项块无法复制
public static void main()
的功能的情况,允许任何和所有的黑客…@richardingle True。。。我猜这是另一个可以做但永远不应该堆积起来的事情……避免异常的唯一原因是,您告诉JVM在完成查找
main()
之前退出。另外,我有点怀疑您是否能够在类加载阶段完成所有工作……您还使带有被黑客攻击的静态块(class
A
)的类无法运行。在它完成初始化之前,我会非常怀疑使用它的任何实例。当去掉主方法时,很多事情都会变得更加困难。你看到了什么好处?我不知道该问到哪里,但我想知道是否有可能构造一个静态初始值设定项块无法复制
public static void main()
的功能的情况,允许任何和所有的黑客…@richardingle True。。。我猜这是另一个可以做但永远不应该堆积的事情……我不这么认为,静态块是在类装入器完成其工作后调用的。@sky类初始化,包括静态块的执行,是在类装入过程中完成的