當前位置:才華齋>計算機>java語言>

Java final 修飾符

java語言 閱讀(2.36W)

導語:final從字面上理解含義為“最後的,最終的”。在Java中也同樣表示出此種含義。下面是相關知識,歡迎參考!

Java final 修飾符

final可以用來修飾變數(包括類屬性、物件屬性、區域性變數和形參)、方法(包括類方法和物件方法)和類。

  1. final修飾類:

final修飾類即表示此類已經是“最後的、最終的”含義。因此,用final修飾的類不能被繼承,即不能擁有自己的子類。

如果檢視對一個已經用final修飾的類進行繼承,在編譯期間或發生錯誤。

  2. final修飾方法:

final修飾的方法表示此方法已經是“最後的、最終的”含義,亦即此方法不能被重寫(可以過載多個final修飾的方法)。

此處需要注意的一點是:因為重寫的前提是子類可以從父類中繼承此方法,如果父類中final修飾的方法同時訪問控制權限為private,

將會導致子類中不能直接繼承到此方法,因此,此時可以在子類中定義相同的方法名和引數,此時不再產生重寫與final的'矛盾,而是

在子類中重新定義了新的方法。

1 public class B extends A {

2

3 public static void main(String[] args) {

4

5 }

6

7 public void getName() {

8

9 }

10 }

11

12 class A {

13

14 /**

15 * 因為private修飾,子類中不能繼承到此方法,因此,子類中的getName方法是重新定義的、

16 * 屬於子類本身的方法,編譯正常

17 */

18 private final void getName() {

19

20 }

21

22 /* 因為pblic修飾,子類可以繼承到此方法,導致重寫了父類的final方法,編譯出錯

23 public final void getName() {

24

25 }

26 */

27 }

  3. final 修飾變數:

final修飾的變量表示此變數是“最後的、最終的”含義。一旦定義了final變數並在首次為其顯示初始化後,final修飾的變數值不可被改變。

這裡需要注意以下幾個問題:

1. final修飾的變數,無論是類屬性、物件屬性、形參還是區域性變數,這些變數都是需要進行顯示初始化(即為其顯示指定初始值)。

對於final修飾的形參,由於是實參傳遞過來的,很好理解。

對於final修飾的區域性變數,與未用final修飾的變數一樣,都是需要顯示初始化。即區域性變數都是需要顯示初始化的。

對於一般的類屬性和物件屬性,由類和物件的初始化過程中可以看出,首先都進行了預設初始化。然後對有顯示賦值的變數才再進行顯示初始化。

但對final修飾的類屬性和物件屬性而言,如果不顯示初始化,其預設將是進行預設初始化後的值,這與final本身出發點矛盾,因此,Java語法規定:

final修飾的類屬性和變數屬性必須要進行顯示初始化賦值。

另外,無論對於基本資料型別還是引用資料型別,final修飾的變數都是首次顯示初始化後值都不能修改。對於基本資料型別,很好理解。對於引用

資料型別,引用變數指向的是實際的物件,但其儲存的是所指向物件的地址,因此,其值不能修改並不意味著其所指向的物件不能修改。

  4. final修飾變數後導致的“巨集替換”/"巨集變數"問題

Java 中巨集變數/巨集替換指的是在java程式碼中在編譯期某些變數能夠直接被其本身的值所替換,編譯到s檔案中。因此,編譯後的s檔案中已經不存在此變了。

在String型別的變數中,有時候經常遇到如下情況:

1 public class Test {

2

3 public static void main(String[] args) {

4

5 String country = "China";

6 String name = "qqyumidi";

7

8 String userInfo = country + name; //編譯後此處依然是country和name變數

9 String user = "China" + "qqyumidi"; //編譯後此處直接變成Chinaqqyumidi

10

11 }

12 }

在上述程式碼中的第9行,編譯後的變數結果直接為Chinaqqyumidi。而第8行程式碼中,由於country和name都是普通的變數,編譯器無法在編譯時直接確定userInfo的值,因此

此處編譯後結果不直接是Chinaqqyumidi。

但是,如果希望第8行中的程式碼在編譯期直接就能表示為Chinaqqyumidi,就需要用到final修飾符對country和name變數進行修飾。

原因:final修飾符修飾的變數在由於其本身的特性,在編譯期就能直接確定其值,且此值不可變。在編譯過程中,可以直接將其變數直接轉換成其值本身去表示。

1 public class Test {

2

3 public static void main(String[] args) {

4

5 final String country = "China";

6 final String name = "qqyumidi";

7

8 String userInfo = country + name; //編譯後此處直接是Chianqqyumidi

9

10 }

11 }