《Java编程语言》上关于final域有一句话:
“常量一种特殊的变量,因为编译器把他们当作值(value)而不是域(field)来对待。如果你的代码中用到了常变量(constant variable),编译器并不会生成字节码来从对象中载入域的值,而是直接把这个值插入到字节码中。这是一种很有用的优化,但是如果你需要改变final域的值,那么每一块用到那个域的代码都需要重新编译。”
请问红色的那段,该如何理解?“从对象载入域的值来生产字节码”和“直接把值插入到字节码中”有什么区别呢?

解决方案 »

  1.   

    个人看法:
    一个常量值为ABC
    这个ABC不会编译成字节码 在程序生成的字节码中就是ABC
    这样程序每次编译的时候生成的字节码的时候都不会去将ABC编译成字节码(也就是说程序看到ABC这个常量就直接跳过了)
      

  2.   

    比如两个类文件
    Test.java
    public class Test{
       public static final int a=5;
       public static final String str="Hello World!";
    }UseTest.java
    public class UseTest{
       public static void main(String [] args){
          System.out.println(Test.a);
          System.out.println(Test.str);
       }
    }这个UseTest.java编译后实际的内容就是
     System.out.println(5);
      System.out.println("Hello World");
    而不是运行的时候去找到类Test,再解析a和str的内容。
    已经和Test类没有关系了,如果你把类Test该了,UseTest也要重写编译才能得到修改之后的信息。
      

  3.   


    可以理解为把 变量的值 写在 .class文件里了。而不是等到执行时,由解释器对表查找具体该是什么值。
      

  4.   

    http://blog.csdn.net/ZangXT/archive/2008/12/13/3511697.aspx
      

  5.   


    多谢楼上各位,特别是ZangXT,一句晦涩抽象的话,经你这么一比方,立刻豁然开朗,看来《Java编程语言》这本书果然是本九阴真经,不经大侠提点,一般人很难理解其中真正含义