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

jan*_*sad 8 java

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

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 20

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

javap -c com.test.doubt.MyProgram
Run Code Online (Sandbox Code Playgroud)

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

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

public static final String FOO = "Foo";
Run Code Online (Sandbox Code Playgroud)

以及所有这些:

public static final String FOO = "Foo";
public static final String BAR = "Bar";
public static final String FOOBAR = FOO + BAR;
Run Code Online (Sandbox Code Playgroud)

......但这不会

public static final String NOT_A_CONSTANT = "Foo".substring(0, 1);
Run Code Online (Sandbox Code Playgroud)

  • @Thilo:不,它确实*也发生在String上,只要它是一个编译时常量.有关详细信息,请参阅JLS的第15.28节. (3认同)

Bri*_*new 10

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

System.out.println(123);
Run Code Online (Sandbox Code Playgroud)

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