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

Java 为什么静态块中的代码不执行?,java,Java,在这里,当我在mainstatic块中打印常量时,我执行了一个程序。。 但是当我打印执行的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"

在这里,当我在
main
static
块中打印
常量时,我执行了一个程序。。
但是当我打印执行的
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);
  }
}

您的代码没有初始化
怀疑
类,正是因为
怀疑.constant
是一个常量。它的值在编译时被烘焙到
MyProgram
中,您甚至可以在编译后删除
dis疑。class
,您的程序仍将运行

查看编译后代码的外观

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

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);

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

System.out.println(123);

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

+1换句话说,
javac
编译器优化了对
怀疑
类的需求。@Thilo:不,只要字符串是编译时常量,它也会发生。详见JLS第15.28节。
package com.test.com;类怀疑{public static final int constant=123;public static int stat=123;static{System.out.println(“static Block”);}}}}公共类MyProgram{public static void main(String[]args){//System.out.println(怀疑.constant);System.out.println(怀疑.stat);}
但此代码打印静态块,因此,我感到困惑,我只是尝试了一下,并且假设编译时已知的任何常量都会发生这种情况。还要注意,当您试图通过更新引用的类文件来更改常量时,会产生副作用。不起作用,因为定义仅在编译时(使用它的类)使用。
System.out.println(123);