final變數的初始化位置
一是其定義處,也就是說在final變數定義時直接給其賦值,
二是在建構函式中。而且在j**a1.1以前,只能是在定義時給值。
三是在初如化**塊中{} 或者 static{}
複製** **如下:
public class initorder
static
final int a1 = 1;
final int b1;
final int c1;
final int d1;
//final int e1;
static final int a2 = 1;
//static final int b2;
static final int c2;
static final int d2;
//static final int e2;
static
public initorder()
public static void main(string args)
}說明:上述所有注釋皆為有語法錯誤
輸出結果:
before---static field
after---static field
c2=4
before---field
af程式設計客棧ter---field
c1=4
c1=4
c2=4
d1=3
d2=3
結果分析:
1. 對比a1,a2基本沒有什麼問題,定義時就初始化
2. 對比b1,b2在建構函式中初始化,b1沒有問題,b2有問題,這是因為建構函式的呼叫在靜態變數的後面而b2是靜態的,所以會報錯
3. 對比c1,d1發現初始化沒有問題,有問題的是使用輸出語句。對於d1在初始化**塊中不論在哪加輸出語句都會報錯,這是因為d1所在的初始化**塊位置在變數d1定義的前面,而j**a中變數的初始化順序是見j**a中變數的初始化順序, 普通變數和初始化**塊的初始化順序是按照位置的先後的所以輸出用到了d1變數,所以出錯,但有一點我不明白,為什麼在這裡初始化d1不報錯,而且在main函式中還可以呼叫它,難道這個也要去看一下j**a虛擬機器?對於c1在後面加輸出語句沒有問題。前面加有問題很好理解,就是大之前沒有被初始化.
4. 對於c2,d2是和3同樣的道理
5. 對於e1放在靜態**塊中顯然不行,因為靜態**塊最先載入,那時e1還沒有加
6. 對於e2也是,普通**塊的載入要晚於靜態變數,所以也是不行的。
本文標題: 深入理解final變數的初始化
本文位址:
深入理解MyBatis 初始化
我們知道使用mybatis前是需要初始化的,我們來看一段 string resource mybatis.xml inputstream inputstream resources.getresourceasstream resource sqlsessionfactory sqlsessionfa...
final非靜態變數初始化
size medium final變數可以在任何可以被始化的地方被始化,具體應該是建構函式之前或建構函式中,但只能被初始化一次.一旦被初始化後就不能再次賦 值 重新指向其它物件 作為成員變數一定要顯式初始化,而作為臨時變數則可以只定義不初始化 當然也不能引用 即使是作為乙個類中的成員變數,也還可以在...
Java中final變數的初始化方式
public class finaltest1 如果取消該構造方法的注釋,程式就會報錯,因此它沒有為j賦值 public finaltest1 string str 為了方便我們可以這樣寫 public finaltest1 string str 下面的 同樣會報錯,因為對j重複賦值 public ...