是什么让public static void main(String args[]) {}
成为测试代码的约定,而不是简单的static {}
?
class Test {
public static void main(String args[]) {
System.out.println("testing");
}
}
它似乎具有相同的功能,您可以实例化所有者类,使用其方法,其他类,甚至发送输出:
class Test {
static {
System.out.println("testing");
}
}
有没有标准的理由不使用小型static {}
来运行平均测试?我能安全地将其作为我的选择/偏好吗?
换句话说,我想找到一种情况,你把一个代码放在一个你不能(或不应该)放在另一个的代码中,它不会运行或给出意外的结果,等等。
我想说,不使用static {}
进行此类操作的最突出原因是,您几乎无法控制它何时运行。static {}
块在"类初始化时"运行,这意味着至少有四个(注意西班牙调查)对此有害:
- 这不一定只是因为类被加载了
- 另一方面,它确实是因为你想要一个类的实例或引用其他类的静态字段而发生的,这也是为什么你不想把有广泛副作用的代码放在
static {}
块中的主要原因 - 也不能保证不会发生,原因很简单,比如Jar文件在类路径上。JVM可以随时自由地运行
static {}
块,只要是在从其他代码中对类进行任何静态引用之前。"Before"可能意味着"在VM启动时" - 没有任何VM实现具有任何调用参数来根据请求为您运行此类代码
static {}
块的目的是初始化静态类数据(当然,可能是以非常复杂的方式),从前面的几点中,您可以看出为什么它对其他任何东西都没有特别的用处。
在java中,每个应用程序都需要一个主方法,该方法将成为应用程序的入口点。所需的主要方法具有如下签名:
public static void main(String[] args)
这个方法和您建议的另一个方法的区别(除了您的应用程序需要一个以这个签名作为入口点的主方法之外)在于,这是一个方法,并且采用了"String[]args"参数。当从控制台运行程序时,此参数是参数的位置。
每个java应用程序都可以从控制台运行,因此每个应用程序都有一个能够接受任何特殊参数的标准入口点方法是有意义的。
静态{}块不一定是可以调用的方法或函数,因此它不能用作应用程序的入口点。它不需要任何参数,您也无法控制它的代码块何时运行。