这个Java程序总是只打印10但不打印SB.为什么?

cha*_*tra 5 java static-initialization

public class Test {
    public static void main(String[] args) {
        System.out.println(Hello.a1);
    }
}

class Hello {
    static  final int a1=10;
    static {
        System.out.println("SB");
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码始终打印10但不打印SB.为什么?

mzi*_*ard 10

static final字段被实现为一个编译时间常数,其在访问方法/类复制没有任何参考定义(其类)的环境中.这就是访问它不会触发静态类块的原因.

这基本上是由于final关键字.如果删除final如下:

public class Test {
  public static void main(String[] args) {
    System.out.println(Hello.a1);
  }
}
class Hello{
  static int a1=10;
  static{
    System.out.println("SB");
  }
}
Run Code Online (Sandbox Code Playgroud)

您将看到SB按预期打印.


Gob*_*ath 5

您正在使用静态最终常量变量.此变量将在编译时被实际常量值替换,以便提高性能.如果您查看已编译的二进制代码(是的,您不能;)但从技术上讲是假设)它将类似于此:

public class Test {
    public static void main(String[] args) {
        System.out.println(10); // Constant
    }
}

class Hello {
    static  final int a1=10;
    static {
        System.out.println("SB");
    }
}
Run Code Online (Sandbox Code Playgroud)

根据此代码,类Hello不会加载到RAM中.因此它不会打印SB.