java - 使用静态 block 打印一些东西

标签 java static

我尝试在没有 Main 方法的情况下使用静态 block 打印一些内容。 但是我怎么知道在类加载时静态 block 会是 已调用。

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

Output :(with main method)

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

最佳答案

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

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

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

类加载与初始化

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

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

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

关于java - 使用静态 block 打印一些东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16831904/

相关文章:

java - for循环输入整数和小数

c# - 有没有办法在 C# 的子类中强制存在静态成员?

php - 静态变量的默认值

java - 深层复制中 java.util.Date 的行为

java - 如何使用 SVG Salamander 旋转元素

java - Jersey 客户端中的验证错误?

c - 如何用cmocka处理静态元素?

java - NoClassDefFoundError 静态 vs 实例级别

c++ - 带有模板基类的 "definition of a static data member is in the scope of its class"规范规则

java - 如何定义一个方法,该方法接收两个类型为 T 的参数,以及在 java 中扩展 T 的 S ?