先编译下面两个class,PrintWords、Words,然后运行看看结果是什么
public class PrintWords {
     public static void main(String[] args) {
         System.out.println(Words.FIRST + " " +
             Words.SECOND + " " + Words.THIRD);}}public class Words {
     public static final String FIRST = "the";
     public static final String SECOND = null;
     public static final String THIRD = "set";}然后,用下面的Words替换上面的Words,只重新编译 Words class,不要重新编译 PrintWords class然后运行看看结果public class Words {
    public static final String FIRST  = "physics";
    public static final String SECOND = "chemistry";
    public static final String THIRD  = "biology";
}

解决方案 »

  1.   

    为什么结果是 the chemistry set
      

  2.   

    我觉得第一个words里的second是null的` 第二个words就把chemistry赋数值进去了~ 所以最后的结果就是 the chemistry set 了
      

  3.   

    经测试, 确实如此
    标记为static final的已赋值字段, 在不编译主执行程序的情况下,将不从引用类中读取,
    标记为null的字段会从所在类读取.考虑到java的javac
      

  4.   

    经测试, 确实如此
    标记为static final的已赋值字段, 在不编译主执行程序的情况下,将不从引用类中读取,
    标记为null的字段会从所在类读取.考虑到java的编译器javac带有一些自动编译发布的功能(执行 javac PrintWords.java会自动
    检查PrintWords所关联的类并且编译), 我想我们有理由相信对于static final字段javac在
    编译的时候会把这些不会改变的值预编译进本文件(PrintWords.class)的字节码中, 当然null
    是不会的.恩..另外这件事情也说明, 调试程序的时候要全编译比较保险....