java final和static定義域的使用簡介

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

 


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章