更新時(shí)間:2020-06-23 13:26:48 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2594次
final關(guān)鍵字
在java中,final的含義在不同的場景下有細(xì)微的差別,但總體來說,它指的是"這是不可變的".下面,我們來講final的四種主要用法.
1.修飾數(shù)據(jù)
在編寫程序時(shí),我們經(jīng)常需要說明一個(gè)數(shù)據(jù)是不可變得,我們稱之為常量,在java中,用final關(guān)鍵字修飾的變量,只能進(jìn)行一次賦值操作,并且在生命周期內(nèi)不可以改變它的值.更重要的是,final會(huì)告訴編輯器,這個(gè)數(shù)據(jù)是不會(huì)修改的,那么編譯器就可能會(huì)在編譯時(shí)期就對該數(shù)據(jù)進(jìn)行替換甚至執(zhí)行計(jì)算,這樣可以對我們的程序起到一點(diǎn)優(yōu)化.不過在針對基本類型和引用類型時(shí),final關(guān)鍵字的效果存在細(xì)微差別.
我們來看下面的例子:
class Value {
? ? int v;
? ? public Value(int v) {
? ? ? ? this.v = v;
? ? }
}
public class FinalTest {
? ? final int f1 = 1;
? ? final int f2;
? ? public FinalTest() {
? ? ? ? f2 = 2;
? ? }
? ? public static void main(String[] args) {
? ? ? ? final int value1 = 1;
? ? ? ? // value1 = 4;
? ? ? ? final double value2;
? ? ? ? value2 = 2.0;
? ? ? ? final Value value3 = new Value(1);
? ? ? ? value3.v = 4;
? ? }
}
在上面的例子中,我們先看一下main方法中的幾個(gè)final修飾的數(shù)據(jù),在給value1賦初始值之后,我們無法對value1進(jìn)行修改,final關(guān)鍵字起到了常量的作用.從value2我們可以看到,final修飾的變量可以不再聲明時(shí)賦值,即可以先聲明,后賦值.value3是一個(gè)引用變量,這里我們可以看到final修飾引用變量時(shí),只是限定了引用變量的引用不可以改變,既不是將value3再次引用另一個(gè)value對象,但是引用的對象的值是可以改變的,從內(nèi)存模型中我們看的更加清晰:
從上面,final修飾的值是用粗線條的邊框表示它的值是不可改變的,我們知道引用變量的值實(shí)際是它的引用的地址,也就是說該地址的值是不可改變的,從而說明了為什么不可以改變引用變量.而實(shí)際引用的對象實(shí)際上是不受final關(guān)鍵字的影響的,所以他的值是可以改變的.
另一方面,我們看到了用final修飾成員變量時(shí)的細(xì)微差別,因?yàn)閒inal修飾的數(shù)據(jù)的值是不可改變的,所以我們必須確保在使用前就已經(jīng)對成員變量賦值了.因此對于final修飾的成員變量,餓哦們有且只要兩個(gè)地方可以給它賦值,一個(gè)聲明該成員變量時(shí)賦值,另一個(gè)是在構(gòu)造方法中賦值,在這兩個(gè)地方必須給它們賦初始值.
最后我們需要注意的一點(diǎn)是,同時(shí)使用static和final修飾的成員在內(nèi)存中只占據(jù)一段不能改變的存儲空間.
2.修飾方法參數(shù)
前面我們可以看到,如果變量是我們自己創(chuàng)建的,那么使用final修飾表示我們只會(huì)給它賦值一個(gè)且不會(huì)改變變量的值.那么如果變量是做參數(shù)傳入的,我們怎么保證他的值不會(huì)改變呢?這就用到了final的第二種用法,即在我們編寫方法時(shí),可以在參數(shù)前面添加fianl關(guān)鍵字,它表示在整個(gè)方法中,餓哦們不會(huì)(實(shí)際上是不能)改變參數(shù)的值:
public class FinalTest {
? ? /* ... */
? ? public void finalFunc(final int i, final Value value) {
? ? ? ? // i = 5; 不能改變i的值
? ? ? ? // v = new Value(); 不能改變v的值
? ? ? ? value.v = 5; // 可以改變引用對象的值
? ? }
}
3.修飾方法
第三種方式,即使用final關(guān)鍵字修飾方法,它表示該方法不能被覆蓋,這種使用方法主要從設(shè)計(jì)的角度考慮,即明確告訴其他繼承該類的程序員,不希望它們?nèi)ジ采w這個(gè)方法.這種方式我們很容易理解,然而,關(guān)于private和final關(guān)鍵字還有一些聯(lián)系,這就是類中所有的private方法都隱示地指定為final的,由于無法在類外使用private方法,所以也就無法覆蓋它
4.修飾類
了解了final關(guān)鍵字的其他用法,我們很容易可以想到使用final關(guān)鍵字修飾類的作用,那就是用final修飾的類是無法被繼承的。
上面我們講解了final的四種用法,然而,對于第三種和第四種用法,我們卻甚少使用。這不是沒有道理的,從final的設(shè)計(jì)來講,這兩種用法甚至可以說是雞肋,因?yàn)閷τ陂_發(fā)人員來講,如果我們寫的類被繼承的越多,就說明我們寫的類越有價(jià)值,越成功。即使是從設(shè)計(jì)的角度來講,也沒有必要將一個(gè)類設(shè)計(jì)為不可繼承的。Java標(biāo)準(zhǔn)庫就是一個(gè)很好的反例,特別是Java 1.0/1.1中Vector類被如此廣泛的運(yùn)用,如果所有的方法均未被指定為final的話,它可能會(huì)更加有用。如此有用的類,我們很容易想到去繼承和重寫他們,然而,由于final的作用,導(dǎo)致我們對Vector類的擴(kuò)展受到了一些阻礙,導(dǎo)致了Vector并沒有完全發(fā)揮它應(yīng)有的全部價(jià)值。
Java技術(shù)內(nèi)容
Java中final關(guān)鍵字的作用:http://www.dabaquan.cn/tutorial_java_advance/607.html
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對“編程基礎(chǔ)Java中final關(guān)鍵字”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級 202925
初級 203221
初級 202629
初級 203743