Static Final用法
一、final數(shù)據(jù)
在 java編程語(yǔ)言中,有時(shí)候需要告知編譯器一段數(shù)據(jù)是不變的編譯期常量。對(duì)于這種情況,編譯器可以將此常量值帶入需要用到它的計(jì)算式子當(dāng)中,這種在編譯時(shí) 執(zhí)行計(jì)算式的方法減輕了運(yùn)行時(shí)的開(kāi)銷(xiāo)。通常,這類(lèi)常量數(shù)據(jù)都是基本類(lèi)型的數(shù)據(jù),并賦予關(guān)鍵字final,同時(shí)在對(duì)此常量定義時(shí)需要進(jìn)行賦值。
值得注意的是:對(duì)于基本類(lèi)型,使用final關(guān)鍵字將使數(shù)值恒定不變;而對(duì)于對(duì)象引用,final則是使引用恒定不變。一旦引用被初始化為指向一個(gè)對(duì)象時(shí),它也就無(wú)法再指向另外一個(gè)對(duì)象,然而該對(duì)象本身是可以被修改的。通常,對(duì)于一個(gè)既是static又是final的域只占一段不能改變的存儲(chǔ)空間。
下面的例子驗(yàn)證了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++;//對(duì)象引用不能改變,但是其對(duì)象本身是可以修改的
????????????? ft1.h3=new Hank(2);
????????????? //ft1.h1=new Hank(1);常量對(duì)象引用不能再指向另一個(gè)對(duì)象引用
????????????? for(int i=0;i<ft1.a.length;i++)
????????????? {
???????????????????? ft1.a[i]++; //對(duì)象引用不能改變,但是其對(duì)象本身是可以修改的
???????????????????? System.out.println(ft1.a[i]);
????????????? }
????????????? //ft1.a=new int[3];常量對(duì)象引用不能再指向另一個(gè)對(duì)象引用
?????? }
}
?
二、空白final
??? 被聲明為final但又沒(méi)有給定初值的域即為空白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;
??? }?????
}?
?
三、final參數(shù)
?????? Java允許在函數(shù)參數(shù)列表中以聲明的方式將參數(shù)指明為final,這使得在函數(shù)體當(dāng)中修改參數(shù)引用所指向的對(duì)象變得不合法。比如說(shuō):
class Args
{
?????? public void f(String s){System.out.println(s);}
}
public class ArgsFinal
{
?????? void has(final Args arg)
?????? {
????????????? //arg=new Args();不能修改final參數(shù)
????????????? arg.f("with final");
?????? }
?????? void dnthas(Args arg)
?????? {
????????????? arg=new Args();//能修改final參數(shù)
????????????? arg.f("without final");
?????? }
?????? public static void main(String[] args)
?????? {
????????????? ArgsFinal af=new ArgsFinal();
????????????? Args ar=new Args();
????????????? af.has(ar);//with final
????????????? af.dnthas(ar);//without final
?????? }
}
?
四、final類(lèi)
?????? 如果不想繼承某個(gè)類(lèi),則可以考慮將此類(lèi)設(shè)置成final的形式。即是說(shuō),程序員對(duì)該類(lèi)不能做任何改動(dòng),同時(shí)也意味著它不會(huì)有子類(lèi)。比如:
?????? Class Base{ …}
?????? Final Class SubClass{…}
?????? //! Class Derived extends SubClass{…}不能由final類(lèi)SubClass導(dǎo)出新類(lèi)
需要注意的是,所有final類(lèi)中的方法都隱式的final,他們是無(wú)法被覆蓋或修改的,因此在其中的方法顯示指明為final就顯得有些多此一舉了。
轉(zhuǎn)載于:https://www.cnblogs.com/wzyxidian/p/4383305.html
總結(jié)
以上是生活随笔為你收集整理的Static Final用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 烟台万科翡翠大道是毛坯房还是精装修?
- 下一篇: 上海天安象屿西江悦楼盘地址在哪里?