8

constant在这里,当我打印in块时我做了一个程序 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);
  }
}
4

2 回答 2

20

您的代码没有初始化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);
于 2012-08-08T11:47:16.160 回答
11

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

System.out.println(123);

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

于 2012-08-08T11:48:08.463 回答