深入理解final變數的初始化

2022-10-07 07:57:08 字數 1300 閱讀 4508

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 ...