我试图在没有Main方法的情况下使用静态块打印一些东西。 但是我怎么知道在类加载静态块的时候会是 调用。
这里删除主要方法,它不在CMD和Eclipse IDE中打印任何东西。
输出:(使用主方法)
静态块叫........ 我:6
public class StaticBlock
{
static int i = 5;
static
{
System.out.println("Static Block Called........");
i ++;
}
public static void main(String args[])
{
System.out.println("i :"+i);
}
}
答案 0 :(得分:4)
这实际上是一个在Java 7中发生变化的行为细节。
在Java 7之前,无论哪个类作为应用程序入口点传递给JVM,都会加载该类,初始化,然后查找main
方法。即使没有这样的方法,类初始化代码也会运行。这包括任何静态初始化器。
从Java 7开始,将加载该类,但在查找main
方法之前将不会初始化。如果找不到方法,JVM将中止错误,并且永远不会发生初始化。
出于许多目的,这只是一个微妙的差异,但实际上你已经找到了一个至关重要的地方。根据Java语言/ Java虚拟机规范,明确区分:
class loading :这种情况随时发生,对于任何类,特定的JVM实现都适合。它意味着加载.class文件的二进制内容,解析它们,验证字节码,构建常量池等等;
class 初始化:这发生在精确指定的点,即在JVM运行期间第一次引用(显式或其他)类时。此时,所有类初始值设定项都会运行。
答案 1 :(得分:3)
除非在某处未提及,否则不会加载您的StaticBlock类。使用main方法会导致您的类被加载,因为jvm在您运行它时会加载该类。只要在项目的任何位置引用StaticBlock类,就可以使用同一类中的main方法或不同类中的main方法。这将导致类被加载,一旦类被绑定,该类中的静态块将被执行。
通过引用我的意思是要么创建它的实例,要么使用类名的任何公共方法或字段,即StaticBlock.filed或StaticBlock.method()。
简而言之,当类被类加载器加载时,将执行类静态块。