注释空间太小,因此这里有一些有关的更多信息static final。正如我在对Andrzej的回答的评论中所说的那样,只有原始和String直接作为文字直接编译到代码中。为了证明这一点,请尝试以下操作:
通过创建三个类(在单独的文件中),可以看到实际的效果:
public class DisplayValue {
private String value;
public DisplayValue(String value) {
this.value = value;
}
public String toString() {
return value;
}
}
public class Constants {
public static final int INT_VALUE = 0;
public static final DisplayValue VALUE = new DisplayValue("A");
}
public class Test {
public static void main(String[] args) {
System.out.println("Int = " + Constants.INT_VALUE);
System.out.println("Value = " + Constants.VALUE);
}
}
编译这些文件并运行Test,它将输出:
Int = 0
Value = A
现在,Constants对每个类进行更改以具有不同的值,并且仅编译类Constants。Test再次执行(不重新编译类文件)时,它仍会打印的旧值,INT_VALUE但不会打印VALUE。例如:
public class Constants {
public static final int INT_VALUE = 2;
public static final DisplayValue VALUE = new DisplayValue("X");
}
运行测试而无需重新编译Test.java:
Int = 0
Value = X
请注意,与一起使用的任何其他类型static final都保留为参考。
与C / C ++ #if/ 类似,在常规Java 条件下使用#endif常量常量或static final使用原语定义的常量常量,if并求值false会导致编译器剥离该if块内语句的字节码(不会生成)。
private static final boolean DEBUG = false;
if (DEBUG) {
...code here...
}
“ ...此处的代码...”中的代码不会被编译为字节码。但是,如果您更改DEBUG为true,它将变为。