2016-11-10 127 views

回答

5

對於你的類的每個實例都執行一個實例初始化塊(這是你的例子),這意味着你的final static變量將被初始化多次(每個實例一次)。這是不允許的final變量。

0

變量ystaticfinal

  • static關鍵字使變量成爲類的成員,因此不需要爲創建類的對象來訪問靜態變量。
  • final關鍵字只允許一次

你已宣佈爲初始化變量的static final變量,但沒有初始化它。這隻能初始化;

  1. 在其聲明
  2. 在靜態初始化劑塊

靜態初始化劑塊被定義在與實例相同的初始化劑,但是與之前的關鍵字static;

static { 
    // code 
} 

當編譯並運行類時,靜態初始化程序僅插入到內存中一次。

您已在實例初始化程序中初始化變量y。每創建一個對象Static時,都會運行此代碼塊。

因此,您的代碼無法編譯的原因是因爲每次創建類的對象時,final變量y都可以重新分配(儘管值相同)至值8。

如果變量必須是final的,則創建一個靜態初始化程序;

final static int y; 
static { 
    y = 8; 
} 

要不然滴在變量聲明finalstatic或兩個關鍵字,並保持實例初始化器原樣;

int y; 
{ 
    y = 8; 
} 

static int y; 
{ 
    y = 8; 
} 

final int y; 
{ 
    y = 8; 
} 
相關問題