Java中final關鍵字,18K的程式設計師都可能沒徹底搞清楚

最近項目剛上完線,我又清閒了於是深入學習下final,有很多細節以前真沒注意。

1.final修飾類

  • 表示這個類不能被繼承,如String
  • final類中的所有成員方法都會被隱式地指定為final方法

2.修飾方法

《Java編程思想》:

Java中final關鍵字,18K的程序員都可能沒徹底搞清楚

注:類的private方法會隱式地被指定為final方法。

3.修飾變量

對於一個final變量,如果是基本數據類型的變量,則其數值一旦在初始化之後便不能更改;如果是引用類型的變量,則在對其初始化之後便不能再讓其指向另一個對象

Java中final關鍵字,18K的程序員都可能沒徹底搞清楚

重新賦值會編譯報錯,如上。

1.類的final變量和普通變量有什麼區別?【重點】

java是這樣設計的:final一生只認一個值,你初始化好了,他就不能在重新賦值。

當用final作用於類的成員變量時,成員變量(注意是類的成員變量,局部變量只需要保證在使用之前被初始化賦值即可)必須在定義時或者構造器中進行初始化賦值

Java中final關鍵字,18K的程序員都可能沒徹底搞清楚

運行結果:
true
false

final在編譯器就確認了值

Java中final關鍵字,18K的程序員都可能沒徹底搞清楚

這段代碼的輸出結果為false,方法getHello編譯器不能確定。

2.被final修飾的引用變量指向的對象內容可變嗎?

內容可變,不變的是地址,記住是地址,這個面試經常考。

3.final和static

  • static保證只有獨一份
  • final保證值不變,記住引用變量內容是可以變的。

4.匿名內部類中使用的外部局部變量為什麼只能是final變量?

Java中final關鍵字,18K的程序員都可能沒徹底搞清楚

5.關於final參數的問題

使用final修飾方法參數的目的是防止修改這個參數的值,同時也是一種聲明和約定,強調這個參數是不可變的


原因在於java採用的是值傳遞這個話題很受爭議】,對於引用變量,傳遞的是引用的值【準確講是內存裡的地址】,

也就是說讓實參形參同時指向了同一個對象

因此讓形參重新指向另一個對象對實參並沒有任何影響。

Java中final關鍵字,18K的程序員都可能沒徹底搞清楚

Java中final關鍵字,18K的程序員都可能沒徹底搞清楚

這裡的buffer.append操作的地址跟實參是同一個,所以結果是hello world.

如果方法changeValue裡,buffer=new StringBuffer("程序汪汪");這裡只能改變形參的地址,但不能改變實參的地址,所以打印結果是外面的 hello【這地方很容易翻車

Java中final關鍵字,18K的程序員都可能沒徹底搞清楚

最後輸出的還是 hello world

實參和形參【科普】

1、形參變量只有在被調用時才分配內存單元,在調用結束時,就會釋放出所分配的內存單元。所以,形參只能在函數內部才有效;【生存週期在方法內

2、實參是:常量、變量、表達式、函數等,實參是何種類型的量,當開始在進行函數調用時,都必須有確定的值;【實參複雜值給形參】

3、在一般傳值調用的機制中只能把實參傳送給形參,因此在函數調用過程中,形參值發生改變,而實參中的值不會變化。【很重要

參考文章

Java中final關鍵字,18K的程序員都可能沒徹底搞清楚


分享到:


相關文章: