1、單獨final修飾的變量,如: final int f ;可以在定義時不用初始化,但此時f的值爲空白,沒有默認值0,所以必須保證在實例化對象時需要初始化,否則編譯是 報錯
即要在構造函數裏面進行初始化,或者在定義出進行初始化,如 final int f =10;但一旦被初始化會,其值就不能再被改變,即在f=2時會報錯,編譯時就會報錯:
FinalData.java:11: 無法爲最終變量 f 指定值
f=56;
^
1 錯誤
2、但如果final修飾的一個對象時,只是指這個對象的引用不再可以改變,並不是指這個對象不可以改變,如:
FinalSet finaltwo = new FinalSet(45);
final FinalSet finalthree = new FinalSet(45);
finalthree = finaltwo;
編譯是就報錯:
F:\個人學習\JAVA\program\study>javac FinalData.java
FinalData.java:25: 無法爲最終變量 finalthree 指定值
finalthree = finaltwo;
^
1 錯誤
但是這個引用指向的對象時可以改變的
總結:java不會對其默認初始化,必須保證在實例化對象時完成初始化
3、static修飾的變量,可以定義時初始化,也可以定義時不初始化,如果沒有初始化,在系統會先默認初始化爲系統默認值,如:static int f1;
P.rintln(FinalSet.f1);輸出就是0
static是指這個類共用的一塊內存空間,修改他將影響所有對象,例如
static int f1;
FinalSet finalone = new FinalSet(56);
FinalSet finaltwo = new FinalSet(45);
final FinalSet finalthree = new FinalSet(33);
P.rintln(FinalSet.f1);
finalone.f1=2;
P.rintln(finalone.f1);
P.rintln(finaltwo.f1);
P.rintln(finalthree.f1)
輸入將先是0,後3個都變成2
總結:如果定義式沒有初始化,java會先對其默認初始化,保證在調用其是就有默認值,因爲staic是的類的變量,在沒有實例化對象時就可以使用
4、如果同時被final 和static 初始化,那必須在定義時進行初始化
原因:因爲 final 修飾的,java就不會對其默認初始化,只有定義式初始化或者在構造函數中對其初始化
同時,static修飾的,在沒有實例化對象時就可以使用
所以:就是要求在定義時一定要初始化
附上java測試代碼:
import com.liuww.tools.P; class FinalSet{ private final int f ; //系統不會對其默認初始化,必須自己初始化,此時的值爲空白 static int f1; //系統先默認初始化爲0 static final int f2 = 2; //必須在定義時就初始化 static int f3 =3; FinalSet(int i){ f = i; //此處可以完成final修飾的變量初始化 } static{ f1 =1; // f=3; 對於非靜態變量,不能在靜態塊中進行賦值 int f3 =787; //靜態快相當於一個局部的東西,相當於一個方法一樣,這裏面聲明的變量只是這個塊的局部變量,只是最先被初始化 P.rintln("static.f3="+f3); } public int getData(){ return f; } } public class FinalData{ public static void main(String[] args){ FinalSet finalone = new FinalSet(56); FinalSet finaltwo = new FinalSet(45); final FinalSet finalthree = new FinalSet(33); //此時引用不再能被改變 //finalthree = finaltwo 編譯異常 P.rintln("fnalone.f="+finalone.getData()); P.rintln("fnaltwo.f="+finaltwo.getData()); P.rintln("fnalthree.f="+finalthree.getData()); P.rintln("f1 inital value is ="+FinalSet.f1); finalone.f1=2; P.rintln(finalone.f1); P.rintln(finaltwo.f1); P.rintln(finalthree.f1); P.rintln("f3 inital value is ="+FinalSet.f3); finalone.f3=4; P.rintln("fnalone.f3="+finalone.f3); P.rintln("fnaltwo.f3="+finaltwo.f3); P.rintln("fnalthree.f3="+finalthree.f3); } }
運行結果:
static.f3=787
fnalone.f=56
fnaltwo.f=45
fnalthree.f=33
f1 inital value is =1
2
2
2
f3 inital value is =3
fnalone.f3=4
fnaltwo.f3=4
fnalthree.f3=4