一、illegal forward refrence
前天寫一個類時遇到一個很眼生的編譯錯誤(問題簡化後):
punlic final class Constants{
public static int VAR2 = VAR1 + 1;
public static int VAR1 = 1;
}
編譯時出錯(第2行):
illegal forward refrence
仔細一想,是因為VAR2引用的VAR1在VAR2之後定義,看來在Java中定義static變量時應遵循“聲明先於使用”的原則。
二、static塊
還是上一個類,VAR1和VAR2定義成final,值存在一個propertIEs文件中,在使用前必須將值load進來:
System.getProperties().load(new FileInputStream("constants.propertIEs"));
於是將上面的代碼放在static塊中:
punlic final class Constants{
static{
System.getProperties().load(new FileInputStream("constants.propertIEs"));
}
public static final int VAR2 = System.getPropertIEs().getProperty("var2");
public static final int VAR1 = System.getPropertIEs().getProperty("var1");
}
但在運行時VAR1和VAR2沒有被賦值,debug後發現static塊根本沒有執行。於是頓悟:final變量在編譯時便被編譯器計算、賦值,因此在運行時沒有必要執行static塊。