评论空间太小,所以这里有一些关于static final的使用方面的更多信息。 正如我在对Andrzej的回答的评论中所说的,只有原始string和string以文字的forms直接编译到代码中。 为了演示这一点,请尝试以下操作:
您可以通过创build三个类(在单独的文件中)来看到这一点:
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); } }
编译这些并运行testing,打印:
Int = 0
值= 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"); }
运行testing,不用重新编译Test.java :
Int = 0
值= X
请注意,任何其他使用static finaltypes都将保留作为参考。
与C / C ++#if / #endif类似,一个常量字面量或通过static final定义的,在常规的Java if条件中使用并计算为false将导致编译器去除if块中语句的字节码(他们不会被生成)。
private static final boolean DEBUG = false; if (DEBUG) { ...code here... }
“… code here …”中的代码不会被编译到字节码中。 但是,如果您将DEBUG更改为true ,则会是。