深刻懂得final變量的初始化。本站提示廣大學習愛好者:(深刻懂得final變量的初始化)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻懂得final變量的初始化正文
final變量的初始化地位
一是其界說處,也就是說在final變量界說時直接給其賦值,
二是在結構函數中。並且在Java1.1之前,只能是在界說時給值。
三是在初如化代碼塊中{} 或許 static{}
public class InitOrder {
{
System.out.println("before---field");
//System.out.println("d1="+d1);
d1 = 3;
//System.out.println("d1="+d1);
}
static {
System.out.println("before---static field");
//System.out.println("d2="+d2);
d2 = 3;
//System.out.println("d2="+d2);
}
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;
{
System.out.println("after---field");
//System.out.println("c1="+c1);
c1 = 4;
System.out.println("c1="+c1);
//e2 =3;
}
static {
System.out.println("after---static field");
//System.out.println("c2="+c2);
c2 = 4;
System.out.println("c2="+c2);
//e1 = 3;
}
public InitOrder() {
b1 = 2;
//b2 = 2;
}
public static void main(String[] args) {
InitOrder order = new InitOrder();
System.out.println("c1="+order.c1);
System.out.println("c2="+order.c2);
System.out.println("d1="+order.d1);
System.out.println("d2="+order.d2);
}
}
解釋:上述一切正文皆為有語法毛病
輸入成果:
before---static field
after---static field
c2=4
before---field
after---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界說的後面,而java中變量的初始化次序是見Java中變量的初始化次序, 通俗變量和初始化代碼塊的初始化次序是依照地位的前後的所以輸入用到了d1變量,所以失足,但有一點我不明確,為何在這裡初始化d1不報錯,並且在main函數中還可以挪用它,豈非這個也要去看一下java虛擬機?關於c1在前面加輸入語句沒有成績。後面加有成績很好懂得,就是年夜之前沒有被初始化.
4. 關於c2,d2是和3異樣的事理
5. 關於e1放在靜態代碼塊中明顯不可,由於靜態代碼塊最早加載,那時e1還沒有加
6. 關於e2也是,通俗代碼塊的加載要晚於靜態變量,所以也是不可的。