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

时间:2012-08-08 11:45:29

标签: java

我在constant 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);
  }
}

2 个答案:

答案 0 :(得分:20)

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

运行

javap -c com.test.doubt.MyProgram

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

请参阅section 15.28 of the JLS了解常量表达式的构成。例如,这仍然是一个常数:

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

答案 1 :(得分:10)

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

System.out.println(123);

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