我在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);
}
}
答案 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
类(这是不以这种方式指定常量的参数,顺便说一下。如果你改变了这个值,你有重新编译每个引用类)