静态块在java中未处理

时间:2013-04-06 21:41:37

标签: java

在访问带有类名的最终静态变量时,为什么不在java中处理静态块?

class Foo {
  public static final int BAR;
  static {
    System.out.println("Hello");
    }
  }
class Baz {
  public static void quux() {
    System.out.println(Foo.BAR);
  }
}

2 个答案:

答案 0 :(得分:11)

有时候 - 这取决于变量实际上是常量

  • 它必须是字符串或原始变量(可能任何其他具有空值的类;我必须检查)
  • 初始化表达式必须是常量表达式

如果是这种情况,对变量的任何引用都会有效地转换为值。所以在这段代码中:

class Foo {
    public static final int BAR = 5;
}

class Baz {
    public static void quux() {
        System.out.println(Foo.BAR);
    }
}

Baz中的方法编译为相同的代码:

public static void quux() {
    System.out.println(5);
}

字节码中没有留下Foo.BAR的提示,因此在方法执行时不需要初始化Foo

如果要防止这种情况发生,您始终只是在变量初始值设定项中使用常量表达式进行初始化。例如:

class Foo {
    public static final int BAR;

    static {
        BAR = 5;
    }
}

class Baz {
    public static void quux() {
        System.out.println(Foo.BAR);
    }
}

就编译器而言,这足以使Foo.BAR不算作常量。

答案 1 :(得分:0)

仅在加载类时才执行静态块。在以下情况下将完成此操作:

  1. 最初在程序启动时
  2. 如果在运行时手动加载类

    Ex:使用Class.forName(“ Foo”))