使用静态块打印

时间:2013-05-30 09:01:14

标签: java static

我试图在没有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);
  }
}

2 个答案:

答案 0 :(得分:4)

这实际上是一个在Java 7中发生变化的行为细节。

在Java 7之前,无论哪个类作为应用程序入口点传递给JVM,都会加载该类,初始化,然后查找main方法。即使没有这样的方法,类初始化代码也会运行。这包括任何静态初始化器。

从Java 7开始,将加载该类,但在查找main方法之前将不会初始化。如果找不到方法,JVM将中止错误,并且永远不会发生初始化。

类加载与初始化

出于许多目的,这只是一个微妙的差异,但实际上你已经找到了一个至关重要的地方。根据Java语言/ Java虚拟机规范,明确区分:

  1. class loading :这种情况随时发生,对于任何类,特定的JVM实现都适合。它意味着加载.class文件的二进制内容,解析它们,验证字节码,构建常量池等等;

  2. class 初始化:这发生在精确指定的点,即在JVM运行期间第一次引用(显式或其他)类时。此时,所有类初始值设定项都会运行。

答案 1 :(得分:3)

除非在某处未提及,否则不会加载您的StaticBlock类。使用main方法会导致您的类被加载,因为jvm在您运行它时会加载该类。只要在项目的任何位置引用StaticBlock类,就可以使用同一类中的main方法或不同类中的main方法。这将导致类被加载,一旦类被绑定,该类中的静态块将被执行。

通过引用我的意思是要么创建它的实例,要么使用类名的任何公共方法或字段,即StaticBlock.filed或StaticBlock.method()。

简而言之,当类被类加载器加载时,将执行类静态块。