對與java中的final變量,java編譯器是進行了優(yōu)化的。每個使用了final類型變量的地方都不會通過連接而進行訪問。比如說Test類中使用了Data類中一個final的int數(shù)字fNumber=77,這時候,java編譯器會將77這個常數(shù)編譯到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; } 執(zhí)行命令和結果: Microsoft Windows XP [版本 5.1.2600] (C) 版權所有 1985-2001 Microsoft Corp.
對與java中的final變量,java編譯器是進行了優(yōu)化的。每個使用了final類型變量的地方都不會通過連接而進行訪問。比如說Test類中使用了Data類中一個final的int數(shù)字fNumber=77,這時候,java編譯器會將77這個常數(shù)編譯到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;?
}
執(zhí)行命令和結果:
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的內(nèi)容:
public class Data{
?public static final int fNumber=777;?
}
然后執(zhí)行如下命令:
C:\>javac Data.java
C:\>java Test
77
C:\>
這里我們看到,雖然Data.java中的fNumber已經(jīng)更改為777,而且已經(jīng)重新編譯了,但是因為編譯器把fNumber的副本保存Test類中,所以在重新編譯Test類的前,Test類一直把fNumber認為是77而不是777。下面我們變異Test.java,再執(zhí)行,看看結果。
C:\>javac Test.java
C:\>java Test
777
C:\>
這時候,我們看到,重新編譯的Test類將新的777數(shù)值封裝到了自己類中。
整個過程如下:
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的內(nèi)容
C:\>javac Data.java
C:\>java Test
77
C:\>javac Test.java
C:\>java Test
777
C:\>