0

我尝试使用没有 Main 方法的静态块打印一些东西。但是我怎么知道在类加载的时候会调用静态块。

这里删除主要方法它不会在 CMD 和 Eclipse IDE 中打印任何内容。

输出:(使用 main 方法)

静态块调用............我: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);
  }
}
4

2 回答 2

4

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

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

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

类加载与初始化

出于许多目的,这只是一个细微的区别,但您实际上已经找到了一个至关重要的地方。根据 Java 语言/Java 虚拟机规范,两者之间有明显的区别:

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

  2. 初始化:这发生在一个精确指定的点,即在 JVM 运行期间第一次(显式或以其他方式)引用该类时。此时所有类初始化程序都运行。

于 2013-05-30T09:29:22.627 回答
3

您的 StaticBlock 类将不会被加载,除非它没有在某处被引用。拥有 main 方法会导致您的类被加载,因为 jvm 在您运行它时会加载该类。只要您在项目中的任何位置引用您的 StaticBlock 类,无论是同一类中的主要方法还是不同类中的主要方法。这将导致类被加载,并且一旦类被加载,该类中的静态块将被执行。

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

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

于 2013-05-30T09:05:27.263 回答