當前位置:成語大全網 - 書法字典 - JAVA中final的作用和意義

JAVA中final的作用和意義

Final在Java中不常用,但它為我們提供了在C語言中定義常數等功能。不僅如此,final還允許您控制您的成員、方法或類是否可以被覆蓋或繼承。這些特點使final在Java中處於不可或缺的地位,也是學習Java時必須了解和掌握的關鍵詞之壹。

最終成員

在類中定義變量時,要在變量前面加上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與模式》壹書中的解釋。