淺談JAVA中的final修飾符

final修飾符是JAVA中比較簡單的一個修飾符,不少人經過書本就能夠熟練掌握,但我學的時候,雖然感受會用了,可是並非十分理解這個修飾符,因此我找了相關資料,把個人我的理解分享給你們~~緩存

 

final書本定義:ide

1.final能夠修飾變量,被final修飾的變量被賦初值後,不能對它從新賦值測試

2.final能夠修飾變量,被final修飾的方法被重寫spa

3.final能夠修飾類,被final修飾的類不能派生子類blog

總的來講,就是值不能改,方法不能重寫,類不能繼承,就至關因而終結版。。。。繼承

 

1、final修飾的變量字符串

  被final修飾的實例變量必須顯示地賦初值,且只能如下三種方式:編譯器

  一、定義時初始化編譯

  二、在非靜態初始化塊中爲final實例變量指定初始值test

  三、在構造器中指定初始值

  對於局部變量,則必須賦初值,且賦值後不能再改變~

  給個例子:

  

2、宏變量

  對於一個final變量,無論它時類變量、實例變量、仍是局部變量,只要定義該變量時使用了final修飾,並在定義該final類變量時指定了初始值,並且該初始值能夠在編譯時被肯定下來,那麼這個final變量實質上已經不是變量,至關於一個恆量或者是直接量。

  

  那麼,何爲宏變量?顧名思義,我以爲,所謂宏變量,其實就是恆變量。當定義final變量時就爲該變量指定了初始值,並且該初始值在編譯時就已經肯定下來,那麼這個final變量本質上就是一個「宏變量」,編譯器會把程序中全部用到該變量的地方直接替換成該變量的值。

  下面舉一個經典例子,相信你們都遇到過:

  

  你們先看test測試單元,這是沒有添加final修飾符的,那麼測試結果爲 true/false。str1是一個普通字符串,str2是兩個字符串直接量進行鏈接,因爲編譯器能夠在編譯階段就肯定s2的值」JAVAEE「,因此係統會讓s2直接指向字符串池中緩存中的」JAVAEE"字符串,因此str1==str2,返回結果爲true。而對於str5而言,它的值由str3和str4鏈接獲得,可是不是由兩個直接量鏈接,所以編譯器不會執行「宏替換」,所以編譯器沒法在編譯時肯定str5的值,不會讓str5指向字符串池中緩存中的「JAVAEE」,因此輸出false.

  

  你們再來看test2測試單元,只要給str3和str4添加final修飾符,將其變成宏變量,則編譯器就能肯定str5的值,從而輸出true.

  PS:對於final實例變量而言,若是要將其變爲「宏變量",則必須在定義該變量時就賦初值,不然無效,下面給個例子:

    

 

3、final方法不能被重寫

  

  上面程序Base類中,用final定義父類info方法,可是被final定義的方法是不能重寫的,因此exe7中的info的方法並非重寫Base中的方法,只是子類中的一個普通方法,若是要檢查子類中的方法是否是重寫父類中的方法,能夠給方法強制添加@Override註釋,若是方法報錯,則不是重寫方法。

 

4、內部類中的局部變量

  注意:若是程序要在內部類中使用局部變量,那麼這個局部變量必須使用final修飾!

  

 

 

PS:此處說的內部類指的是局部內部類,由於只有局部內部類(包括匿名內部類)才能夠訪問局部變量,普通靜態內部類、非靜態內部類不可能訪問方法體重的局部變量。

相關文章
相關標籤/搜索