劉志雄
[摘 要]final關(guān)鍵字在java中的應(yīng)用至關(guān)重要。使用final關(guān)鍵字可以使JVM優(yōu)化變量、方法和類(lèi),在多線程環(huán)境下,可以進(jìn)行安全的共享,減少了同步開(kāi)銷(xiāo)。本文結(jié)合簡(jiǎn)單實(shí)例對(duì)final關(guān)鍵字在變量、方法與類(lèi)中定義的用法進(jìn)行了深入的剖析。
[關(guān)鍵詞]final;java;變量;方法;類(lèi)
從英語(yǔ)單詞方面來(lái)看final的含義,有“最終的”“不可更改的”“決定性的”等意思。在java中,其也保留了此含義。final關(guān)鍵字可用于修飾類(lèi)、變量和方法,它有“這是無(wú)法改變的”或者“最終”或者“終結(jié)”的含義,因此被final修飾的類(lèi)、變量和方法具有以下特性:
1.final修飾的類(lèi)不能被繼承。我們可以把這樣的類(lèi)叫做“最終類(lèi)”。
2.final修飾的方法不能被子類(lèi)重寫(xiě)。我們把它叫做“最終方法”。
3.final修飾的變量是常量,只能賦值一次。
接下來(lái),我們分別從以上三個(gè)方面一一用簡(jiǎn)單實(shí)例來(lái)講解final關(guān)鍵字的用法。
一、final在變量定義中的用法
用例如下:
class animal {
final String name;
public void f(){
System.out.print(“這只動(dòng)物名字叫:”+name);
}
public static void main(String[] args){
animal aa=new animal( );
aa.f();
}}
對(duì)代碼進(jìn)行編譯時(shí),出現(xiàn)如下錯(cuò)誤提示:
這是因?yàn)槭褂胒inal關(guān)鍵字修飾成員變量時(shí),虛擬機(jī)不會(huì)對(duì)其進(jìn)行初始化。因此使用final修飾成員變量時(shí),需要在定義變量的同時(shí)賦予一個(gè)初始值,下面將第2行代碼修改為:
final String name = "貓"; 為final關(guān)鍵字修飾的name屬性賦值。但是,如果我們?cè)诘?行代碼前加上語(yǔ)句:name=”狗”;這時(shí)編譯結(jié)果為:
從以上情況說(shuō)明final修飾變量時(shí),必須對(duì)變量進(jìn)行初化,一旦初化,該變量的值不能被改變,即常量。
二、final在方法定義中的用法
用例如下:
class animal {
final String name="貓";
final public void f(){
System.out.print(name);}
class dog extends animal{
void f(){
System.out.print("狗叫汪汪汪");
} }
public static void main(String[] args) {
dog as=new dog();
as.f();} }
對(duì)代碼進(jìn)行編譯時(shí),出現(xiàn)如下錯(cuò)誤提示:
這是因?yàn)閒()方法被final修飾了,dog子類(lèi)不能重寫(xiě)父類(lèi)里的f()方法??梢?jiàn),final修飾的方法是該類(lèi)里的“終結(jié)”方法,不能被重寫(xiě),但是可以繼承使用,即子類(lèi)可以調(diào)用父類(lèi)里final修飾的方法。
三、final在類(lèi)定義中的用法
用例如下:
final class animal {
final String name="貓";
final public void f(){
System.out.print(name);}
class dog extends animal{
}
public static void main(String[] args) {
dog as=new dog();
as.f();} }
對(duì)代碼進(jìn)行編譯,錯(cuò)誤提示為:
這是因?yàn)閍nimal類(lèi)用final修飾了,一個(gè)類(lèi)一旦用final修飾,那么這個(gè)類(lèi)就不用有子類(lèi)了,即final修飾的類(lèi)為“最終類(lèi)”。
四、結(jié)語(yǔ)
由以上敘述可知:final修飾的變量表示常量,定義里就得初始化,且只能被賦值一次,賦值后值不再改變;final修飾的方法不能被子類(lèi)來(lái)重寫(xiě),但是可以被子類(lèi)繼承,即子類(lèi)可以直接調(diào)用父類(lèi)里final修飾的方法;final修飾的類(lèi)不能被繼承,即該類(lèi)不可能有子類(lèi)。
參考文獻(xiàn):
[1] http://www.importnew.com/7553.html.
[2] 高永強(qiáng),Java編程藝術(shù)[M].北京:清華大學(xué)出版社,2009.
[3] 王善發(fā),吳道榮,Java編程中static和final關(guān)鍵字的陷阱,保山學(xué)院學(xué)報(bào),2012,31(5):19-22.
[4] 安博教育集團(tuán),Java核心技術(shù)[M].北京:電子工業(yè)出版社,2012.
基金項(xiàng)目:湖南省教育科學(xué)“十三五”規(guī)劃2017年度課題:XJK17BGD083 。endprint