Java中静态块未经处理

7
在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个回答

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在编译器看来不再被视为常量。


0
静态块只有在类加载时才会执行。以下情况将触发类加载:
  1. 程序启动时
  2. 手动在运行时加载类

    例如:使用 Class.forName("Foo")


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接