在这里我做了一个程序,当我打印 constant
in 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)
Bri*_*new 10
在static final int
将得到直接编译到你的代码作为其值.也就是说,JVM看到并正在执行:
System.out.println(123);
Run Code Online (Sandbox Code Playgroud)
并且你根本没有触及你恰当命名的Doubt
类(这是一个不以这种方式指定常量的参数,顺便说一句.如果你改变了这个值,你必须重新编译每个引用类)