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