一、實例
例1
package yy;
class FinalA{
public static final int a = 6/2;//該值在編譯期間能夠確定
//定義一個靜態代碼塊,用於測試該類是否被初始化
static{
System.out.println("inintalized FinalA");
}
}
public class Test1 {
public static void main(String[] args) {
System.out.println(FinalA.a);
}
}
運行結果:
例2
package yy;
import java.util.Random;
class FinalB{
public static final int a = new Random().nextInt(100);//該值在編譯期間不能夠確定
//定義一個靜態代碼塊,用於測試該類是否被初始化
static{
System.out.println("inintalized FinalB");
}
}
public class Test2 {
public static void main(String[] args) {
System.out.println(FinalB.a);
}
}
運行結果:
三、分析
由程序結果可知,實例1中的FinalA並未初始化,FinalB進行了初始化。原因在於,當在main方法中調用FinalA或FinalB的靜態變量時,FinalA中的變量a在編譯時是已知的,而FinalB中的變量在編譯時是未知的。所以,要使用變量a,Test2必須先初始化FinalB
四、總結
對於在編譯時能夠確定的靜態變量,在使用時可以不對類初始化;
對於在編譯時不能確定的靜態變量,在使用時需要先對類進行初始化。