同時被final和static修飾的類的屬性變量只能在兩種情況下初始化:(必須初始化)
a.在它被定義的時候,例:
- public class Test{
- public final static int a=5;
- private Test(){
- }
- }
b.在類的靜態塊裏初始化,例:
- public class Test{
- public final static int a;
- static{
- a=0;
- }
- }
c、特別對於初始化時候調用拋出異常的構造函數,初始時候注意,特別是在實現單例模式時(只能這麼初始化)
如:
class A
{
private final static A a;
static
{
try
{
a=new A();
}catch(Exception e)
{
throws new RuntimeException(e); //必須有,不然不能完成常量的正確初始化
}
}
private A() throws Exception{}
}
解釋:
當類的屬性被同時被修飾爲static和final的時候,他屬於類的資源(類常量),那麼就是類在被加載進內存的時候(也就是應用程 序啓動的時候)就要已經爲此屬性分配了內存,所以此時屬性已經存在,它又被final修飾,所以必須在屬性定義了以後就給其初始化值.而構造函數是在當類 被實例化的時候纔會執行,所以用構造函數,這時候這個屬性沒有被初始化.程序就會報錯.而static塊是類被加載的時候執行,且只執行這一次,所以在 static塊中可以被初始化.
例如下:
private static final String remote_host = "127.0.0.1";
private static final int remote_port = 12345;