常量值未在运行时反映

时间:2012-01-17 21:16:00

标签: java compiler-construction constants

假设您编译以下两个类。第一个是代表客户;第二,图书馆课。

public class Test{
    public static void main(String[] args) {
        System.out.println(Lib.FIRST + " " +
                           Lib.SECOND + " " +
                           Lib.THIRD);
    }
}


public class Lib{
    private Lib() { }; // Uninstantiable
    public static final String FIRST = "the";
    public static final String SECOND = null;
    public static final String THIRD = "set";
}

打印:

  

{null set}

现在假设您按如下所示修改库类并重新编译它而不是客户端程序:

public class Lib{
    private Lib() { }; // Uninstantiable
    public static final String FIRST = "physics";
    public static final String SECOND = "chemistry";
    public static final String THIRD = "biology";
}

打印:

  

{化学集}

为什么SECOND值已更改,但FIRSTTHIRD没有?

2 个答案:

答案 0 :(得分:7)

这是一个众所周知的警告 - 在编译客户端程序时会内联常量,因此您也必须重新编译它。

另见:

答案 1 :(得分:3)

值内联(即“the”和“set”)是内联的,而编译时编译器没有内联null。为避免这种情况,您可以使用访问器方法。