一、關鍵字final的理解
1、final數(shù)據(jù)
在java編程語言中,有時候需要告知編譯器一段數(shù)據(jù)是不變的編譯期常量。對于這種情況,編譯器可以將此常量值帶入需要用到它的計算式子當中,這種在編譯時執(zhí)行計算式的方法減輕了運行時的開銷。通常,這類常量數(shù)據(jù)都是基本類型的數(shù)據(jù),并賦予關鍵字final,同時在對此常量定義時需要進行賦值。
值得注意的是:對于基本類型,使用final關鍵字將使數(shù)值恒定不變;而對于對象引用,final則是使引用恒定不變。一旦引用被初始化為指向一個對象時,它也就無法再指向另外一個對象,然而該對象本身是可以被修改的。通常,對于一個既是static又是final的域只占一段不能改變的存儲空間。
下面的例子驗證了final數(shù)據(jù)的含義。
class Hank
{
int i;
public Hank(int i){this.i=i;}
}
public class FinalTest
{
private String s;
public FinalTest(String s){this.s=s;}
private final int value=20;
private static final int INT_1=50;
public static final int INT_2=60;
static final int INT_3=70;
private final Hank h1=new Hank(1);
private static final Hank h2=new Hank(2);
private Hank h3=new Hank(3);
private final int[] a={1,2,3,4,5};
public String toString()
{
return s+“: ”+“INT_2= ”+INT_2;
}
public static void main(String[] args)
{
FinalTest ft1=new FinalTest(“ft1”);
//ft1.value++;常量值不能被修改
ft1.h1.i++;//對象引用不能改變,但是其對象本身是可以修改的
ft1.h3=new Hank(2);
//ft1.h1=new Hank(1);常量對象引用不能再指向另一個對象引用
for(int i=0;i《ft1.a.length;i++)
{
ft1.a[i]++; //對象引用不能改變,但是其對象本身是可以修改的
System.out.println(ft1.a[i]);
}
//ft1.a=new int[3]; 常量對象引用不能再指向另一個對象引用
}
}
2、空白final
被聲明為final但又沒有給定初值的域即為空白final,編譯器確保使用前必須初始化空白final。比如:
class Blank
{
private int i;
Blank(int i){this.i=i;System.out.println(“Blank.i=”+this.i);}
}
public class BlankFinal
{
private final int i;//blank final
private final Blank b;//blank final reference
BlankFinal()
{
i=1;b=new Blank(1);//使用前必須初始化
System.out.println(“BlankFinal.i=”+this.i);
}
BlankFinal(int i)
{
this.i=i;b=new Blank(i); //使用前必須初始化
System.out.println(“BlankFinal.i=”+this.i);
}
public static void main(String[] args)
{
new BlankFinal();//Blank.i=1;BlankFinal.i=1;
new BlankFinal(2); //Blank.i=2;BlankFinal.i=2;
}
}
評論
查看更多