网站导航:首页 -> JAVA认证 -> JAVA认证专业语言复习资料 -> Java的final变量需要注意地方

Java的final变量需要注意地方

    对与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 settings\zangmeng>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 settings\zangmeng>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:\>