最近項目剛上完線,我又清閒了於是深入學習下final,有很多細節以前真沒注意。
1.final修飾類
- 表示這個類不能被繼承,如String
- final類中的所有成員方法都會被隱式地指定為final方法
2.修飾方法
《Java編程思想》:
![Java中final關鍵字,18K的程序員都可能沒徹底搞清楚](http://p2.ttnews.xyz/loading.gif)
注:類的private方法會隱式地被指定為final方法。
3.修飾變量
對於一個final變量,如果是基本數據類型的變量,則其數值一旦在初始化之後便不能更改;如果是引用類型的變量,則在對其初始化之後便不能再讓其指向另一個對象。
![Java中final關鍵字,18K的程序員都可能沒徹底搞清楚](http://p2.ttnews.xyz/loading.gif)
重新賦值會編譯報錯,如上。
1.類的final變量和普通變量有什麼區別?【重點】
java是這樣設計的:final一生只認一個值,你初始化好了,他就不能在重新賦值。
當用final作用於類的成員變量時,成員變量(注意是類的成員變量,局部變量只需要保證在使用之前被初始化賦值即可)必須在定義時或者構造器中進行初始化賦值
運行結果:
true
false
final在編譯器就確認了值
這段代碼的輸出結果為false,方法getHello編譯器不能確定。
2.被final修飾的引用變量指向的對象內容可變嗎?
內容可變,不變的是地址,記住是地址,這個面試經常考。
3.final和static
- static保證只有獨一份
- final保證值不變,記住引用變量內容是可以變的。
4.匿名內部類中使用的外部局部變量為什麼只能是final變量?
5.關於final參數的問題
使用final修飾方法參數的目的是防止修改這個參數的值,同時也是一種聲明和約定,強調這個參數是不可變的
原因在於java採用的是值傳遞【這個話題很受爭議】,對於引用變量,傳遞的是引用的值【準確講是內存裡的地址】,
也就是說讓實參和形參同時指向了同一個對象,
因此讓形參重新指向另一個對象對實參並沒有任何影響。
這裡的buffer.append操作的地址跟實參是同一個,所以結果是hello world.
如果方法changeValue裡,buffer=new StringBuffer("程序汪汪");這裡只能改變形參的地址,但不能改變實參的地址,所以打印結果是外面的 hello【這地方很容易翻車】
最後輸出的還是 hello world
實參和形參【科普】
1、形參變量只有在被調用時才分配內存單元,在調用結束時,就會釋放出所分配的內存單元。所以,形參只能在函數內部才有效;【生存週期在方法內】
2、實參是:常量、變量、表達式、函數等,實參是何種類型的量,當開始在進行函數調用時,都必須有確定的值;【實參複雜值給形參】
3、在一般傳值調用的機制中只能把實參傳送給形參,因此在函數調用過程中,形參值發生改變,而實參中的值不會變化。【很重要】
參考文章
閱讀更多 程序汪汪 的文章