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