package com.static2;
public class Static {
final static int y;
{
y=8;// error: the value cant be initialized
}
}
我們可以訪問非靜態塊中的靜態成員,但爲什麼我們不能訪問非靜態塊中的靜態最終成員?爲什麼不能在非靜態塊中聲明靜態最終變量?
package com.static2;
public class Static {
final static int y;
{
y=8;// error: the value cant be initialized
}
}
我們可以訪問非靜態塊中的靜態成員,但爲什麼我們不能訪問非靜態塊中的靜態最終成員?爲什麼不能在非靜態塊中聲明靜態最終變量?
對於你的類的每個實例都執行一個實例初始化塊(這是你的例子),這意味着你的final static
變量將被初始化多次(每個實例一次)。這是不允許的final
變量。
變量y
是static
和final
。
static
關鍵字使變量成爲類的成員,因此不需要爲創建類的對象來訪問靜態變量。final
關鍵字只允許一次你已宣佈爲初始化變量的static final
變量,但沒有初始化它。這隻能初始化;
靜態初始化劑塊被定義在與實例相同的初始化劑,但是與之前的關鍵字static
;
static {
// code
}
當編譯並運行類時,靜態初始化程序僅插入到內存中一次。
您已在實例初始化程序中初始化變量y
。每創建一個對象Static
時,都會運行此代碼塊。
因此,您的代碼無法編譯的原因是因爲每次創建類的對象時,final
變量y
都可以重新分配(儘管值相同)至值8。
如果變量必須是final的,則創建一個靜態初始化程序;
final static int y;
static {
y = 8;
}
要不然滴在變量聲明final
,static
或兩個關鍵字,並保持實例初始化器原樣;
int y;
{
y = 8;
}
static int y;
{
y = 8;
}
final int y;
{
y = 8;
}