作者:深夜兩點
轉自:http://dev.csdn.net/author/DeepNightTwo/860de540961f4fbd95350352ab2255ea.html
對與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:\>
馬嘉楠
jianan.ma@gmail.com
posted on 2006-10-14 10:24
馬嘉楠 閱讀(422)
評論(1) 編輯 收藏