最終成員
在類中定義變量時,要在變量前面加上final關鍵字,也就是說,變量壹旦初始化,就不能更改。這裏的不可變的含義是,對於基本類型,它的值不能更改,但是對於對象變量,它的引用不能更改。它的初始化可以在兩個地方,壹個是在它的定義處,也就是說,它可以在定義最終變量時直接賦值,另壹個是在構造函數中。您只能在這兩個位置中選擇壹個,要麽在定義時給值,要麽在構造函數中給值。在構造函數中同時定義和另壹個值時,不能給定壹個值。以下代碼演示了這壹點:
導入Java . util . list;
導入Java . util . ArrayList;
導入Java . util . linked list;
公共類Bat{
最終PI = 3.14;//定義時給出地址值。
final int I;//因為它是在構造函數中初始化的,所以此處不能再給定值。
最終名單列表;//這個變量同上。
bat(){
I = 100;
list = new linked list();
}
bat(int ii,List l ){
i = ii
list = l;
}
公共靜態void main(String【】args ){
Bat b =新Bat();
b . list . add(new Bat());
//b . I = 25;
//b . list = new ArrayList();
system . out . println(“I =“+b . I+“列表類型:“+b . List . getclass());
b = new Bat(23,new ArrayList());
b . list . add(new Bat());
system . out . println(“I =“+b . I+“列表類型:“+b . List . getclass());
}
}
這個程序簡單地演示了final的壹般用法。這裏在構造函數中使用初始化的方法給了妳壹點靈活性。如Bat的兩個重載構造函數所示,第壹個默認構造函數將為您提供默認值,重載構造函數將根據您提供的值或類型初始化最終變量。然而,有時妳不需要這種靈活性,妳只需要在定義它時給出值,並且永遠不要更改它,所以不要再使用這種方法。main方法中有兩行註釋。如果刪除註釋,程序將無法編譯。也就是說,無論I的值還是列表的類型,壹旦初始化,就真的無法更改了。但是,b可以通過重新初始化來指定I的值或列表的類型,如輸出所示:
I=100列表類型:java.util.LinkedList類
I=23列表類型:java.util.ArrayList類
另壹種用法是將方法中的參數定義為final。對於基本類型的變量,這沒有實際意義,因為基本類型的變量在調用方法時會傳遞值,也就是說,您可以在方法中更改此參數變量,而不會影響調用語句。但是,它對於對象變量非常實用,因為對象變量在傳遞它們的引用時會傳遞它們的引用。這樣,方法中對象變量的修改也會影響調用語句中的對象變量。當您不需要將對象變量作為方法中的參數更改時,請使用final顯式聲明它,這將防止您無意中修改和影響調用方法。
此外,當方法中的內部類使用方法中的參數變量時,參數變量也必須聲明為final才能使用,如下面的代碼所示:
公共類入類{
void innerClass(最終字符串str ){
類別IClass{
IClass(){
system . out . println(str);
}
}
IClass IC = new IClass();
}
公共靜態void main(String【】args ){
INClass Inc = new INClass();
inc.innerClass(“妳好”);
}
}
最終方法
將該方法聲明為final,這意味著您已經知道該方法提供的函數已經滿足了您的要求,沒有必要對其進行擴展,並且從該類繼承的任何類都不允許重寫該方法,但繼承仍然可以繼承該方法,也就是說可以直接使用。此外,還有壹種稱為內聯的機制,它將使您在調用最終方法時直接將方法體插入調用位置,而不是進行例行的方法調用,例如保存斷點和堆棧,這可能會提高您的程序的效率。但是,當您的方法體非常大,或者您在許多地方調用此方法時,您的調用體代碼將迅速擴展,這可能會影響效率,因此您應該謹慎使用final來定義方法。
最後壹堂課
當您將final應用於某個類時,您需要仔細考慮,因為final類不能被任何人繼承,這意味著該類是繼承樹中的葉類,其設計已經被認為是完美的,不需要修改或擴展。對於final類中的成員,您可以將其定義為final或not。至於方法,因為類屬於final,所以它自然成為final。您也可以在final類中向方法顯式添加final,但這顯然沒有意義。
下面的程序演示了final方法和final類的用法:
期末考試
最終字符串str=“最終數據“;
公共字符串str1=“非最終數據“;
最終公開作廢打印(){
System.out.println(“最終方法。);
}
public void what(){
system . out . println(str+“\ n“+str 1);
}
}
公共類final demo {//extends final無法繼承。
公共靜態void main(String【】args ){
final f = new final();
f . what();
f . print();
}
}
從程序中可以看出,final類的使用與普通類幾乎沒有區別,但它已經失去了其繼承的特性。final方法和非final方法的區別也很難從程序行中看出,只需記住謹慎使用即可。
final在設計模式中的應用
在設計模式中,有壹種稱為不變模式的模式,在Java中可以通過final關鍵字輕松實現。Bat.java,壹個用於解釋最終成員的程序,是不變模式的壹個例子。如果妳對此感興趣,妳可以參考洪雁博士寫的《Java與模式》壹書中的解釋。