1. 程式人生 > >深入理解javaSE之final關鍵字(終結器)(面試重點)

深入理解javaSE之final關鍵字(終結器)(面試重點)

final關鍵字含義

final是java中保留的關鍵字,可以修飾類、方法、屬性以及變數,一旦引用宣告作final,那麼我們將不能改變這個引用了,那麼如果你嘗試去改變的話,編譯器會報錯。

final變數

什麼叫final變數?

final變數就是用final修飾的變數,包括區域性變數和本地變數,這裡解釋一下本地變數,本地變數就是在方法中定義的變數以及在程式碼塊中的變數。

final通常和static一起使用,作為常量,例如:

public static final COUNTRY="China";

final修飾的變數是隻讀的,如果你嘗試去改會發現,編譯器會報錯的。

final方法

final方法就是在方法的前面加上final修飾,表示該方法不可以被子類所覆寫,當然,如果你在寫程式碼時不想讓子類覆寫你的方法,你就可以使用final修飾。

其實final修飾的方法載入的時候比較快,因為在編譯的時候已經靜態繫結過。
下面我們看一個例子:
在這裡插入圖片描述
在上面的程式碼中我們會發現,當子類覆寫父類中final修飾的方法時,編譯器報錯了,這就更加證明了final修飾的方法不能被子類所覆寫

final類

final類就是在類的前面加上final修飾,那麼被final修飾的類就不能被子類繼承了,一遍情況下一個類被final修飾,就說明這個類是足夠完整的,這時候我們就會想到String類以及Integer包裝類,但其實java中有很多這樣的類的。

我們還是看一段錯誤的程式碼來加深一下以上說法:
在這裡插入圖片描述
可以看到編譯器說不能繼承final修飾的類。所以說final修飾的類不能被子類所繼承
要注意的是final一旦修飾一個類之後,該類的所有方法預設都會加上final修飾。(不包含成員變數)

總結

  • final在使用過程中有很多需要注意的地方,我查了很多,先列出來:
  • final關鍵字可以用於成員變數、本地變數、方法以及類。
  • final成員變數必須在宣告的時候初始化或者在構造器中初始化,否則就會報編譯錯誤。
  • 你不能夠對final變數再次賦值。
  • 本地變數必須在宣告時賦值。
  • 在匿名類中所有變數都必須是final變數。
  • final方法不能被重寫。
  • final類不能被繼承。
  • final關鍵字不同於finally關鍵字,後者用於異常處理。
  • final關鍵字容易與finalize()方法搞混,後者是在Object類中定義的方法,是在垃圾回收之前被JVM呼叫的方法。
  • 介面中宣告的所有變數本身是final的。
  • final和abstract這兩個關鍵字是反相關的,final類就不可能是abstract的。
  • final方法在編譯階段繫結,稱為靜態繫結(static binding)。
  • 沒有在宣告時初始化final變數的稱為空白final變數(blank final variable),它們必須在構造器中初始化,或者呼叫this()初始化。不這麼做的話,編譯器會報錯“final變數(變數名)需要進行初始化”。
  • 將類、方法、變數宣告為final能夠提高效能,這樣JVM就有機會進行估計,然後優化。
    按照Java程式碼慣例,final變數就是常量,而且通常常量名要大寫:

典型挖坑練習

到這裡你已經掌握了final的相關知識點,我們做一些簡單的但是很容易跳坑的練習題:

題目是選出下面出錯的語句:

byte b1=1,b2=2,b3,b6,b8;
final byte b4=4,b5=6,b7=9;
public void test() {
b3=(b1+b2); /*語句1*/
b6=b4+b5; /*語句2*/
b8=(b1+b4); /*語句3*/
b7=(b2+b5); /*語句4*/
System.out.println(b3+b6);
}

建議在做之前自己先做一遍,印象會更深哦!
解:

先看語句1,b1和b2都是byte型別的,但是我們知道byte short int 做運算之後結果都是int型別的,而b3是byte型別的,那麼語句1就是向下轉型了,是需要牆磚才可以的,所以語句1是錯的,我們看看結果:

在這裡插入圖片描述

語句2:b4和b5都是final修飾的byte型別,所以做運算之後依然是byte型別的,b6本身也是byte型別,也沒有被final修飾,所以語句2是正確的。

在這裡插入圖片描述
可以看到編譯器並沒有報錯。
語句3和語句1是一樣的,這裡不多說

語句4,如果你看了前面的相關知識,你就會一眼判斷出是錯誤的,因為b7是被final修飾的,所以不能被更改。

在這裡插入圖片描述
所以在這裡面只有語句2是正確的!你做對了嗎()