为什么静态块中的代码不会执行?

这里我做了一个程序,当我打印main static块中的constant不执行..但是当我打印执行的stat是否有任何重要的java static final ..? 请解释

 package com.test.doubt;` class Doubt { public static final int constant = 123; public static int stat = 123; static { System.out.println("Static Block"); } } public class MyProgram { public static void main(String[] args) { System.out.println(Doubt.constant); } } 

static final int将直接编译为代码作为其值。 也就是说,JVM看到并正在执行:

 System.out.println(123); 

并且你根本没有触及你恰当命名的Doubt类(这是一个以这种方式指定常量的参数,顺便说一下。如果你改变了这个值,你必须重新编译每个引用类)

你的代码没有初始化Doubt类,正是因为Doubt.constant 一个常量。 它的值在编译时被放入MyProgram中 – 你甚至可以在编译后删除Doubt.class ,你的程序仍会运行。

 javap -c com.test.doubt.MyProgram 

仔细看看编译后代码的样子。

有关常量表达式的构成,请参见JLS的第15.28节 。 例如,这仍然是一个常数:

 public static final String FOO = "Foo"; 

以及所有这些:

 public static final String FOO = "Foo"; public static final String BAR = "Bar"; public static final String FOOBAR = FOO + BAR; 

……但这不会

 public static final String NOT_A_CONSTANT = "Foo".substring(0, 1);