龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

Java的final变量需要注意地方

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
对与Java中的final变量,java编译器是进行了优化的。每个使用了final类型变量的地方都不会通过连接而进行访问。比如说Test类中使用了Data类中一个final的int数字fNumber=77,这时候,java编译

       对与Java中的final变量,java编译器是进行了优化的。每个使用了final类型变量的地方都不会通过连接而进行访问。比如说Test类中使用了Data类中一个final的int数字fNumber=77,这时候,java编译器会将77这个常数编译到Test类的指令码或者常量池中。这样,每次Test类用到fNumber的时候,不会通过引用连接到Data类中进行读取,而是直接使用自己保存在类文件中的副本。
  用程序说话:
  Test.java:

  public class Test{
   public static void main(String[] args){
    System.out.println(Data.fNumber);
   }
  }

  
  Data.java:

  public class Data{
   public static final int fNumber=77; 
  }

  执行命令和结果:

  Microsoft Windows XP [版本 5.1.2600]
  (C) 版权所有 1985-2001 Microsoft Corp.

  C:Documents and Settingszangmeng>cd ..

  C:Documents and Settings>cd ..

  C:>javac Test.java

  C:>java Test
  77

  C:>

  
  这时候,我们更改Data.java的内容:
  public class Data{
   public static final int fNumber=777; 
  }

  然后执行如下命令:

  C:>javac Data.java

  C:>java Test
  77

  C:>

  这里我们看到,虽然Data.java中的fNumber已经更改为777,而且已经重新编译了,但是因为编译器把fNumber的副本保存Test类中,所以在重新编译Test类的前,Test类一直把fNumber认为是77而不是777。下面我们变异Test.java,再执行,看看结果。

  C:>javac Test.java

  C:>java Test
  777

  C:>
  这时候,我们看到,重新编译的Test类将新的777数值封装到了自己类中。

  整个过程如下:
  Microsoft Windows XP [版本 5.1.2600]
  (C) 版权所有 1985-2001 Microsoft Corp.

  C:Documents and Settingszangmeng>cd ..

  C:Documents and Settings>cd ..

  C:>javac Test.java

  C:>java Test
  77
  //在这里改变了Data.java的内容
  C:>javac Data.java

  C:>java Test
  77

  C:>javac Test.java

  C:>java Test
  777

  C:>


  
精彩图集

赞助商链接