java中的 final 關鍵字 修飾引用時的問題

2021-07-27 06:21:09 字數 869 閱讀 3899

final使得被修飾的變數」不變」,但是由於物件型變數的本質是「引用」,使得「不變」也有了兩種含義:引用本身的不變,和引用指向的物件不變。

引用本身的不變:

final stringbuffer a=new stringbuffer("immutable"); 

final stringbuffer b=new stringbuffer("not immutable");

a=b;//編譯期錯誤

引用指向的物件不變:

final stringbuffer a=new stringbuffer("immutable");

final stringbuffer b=new stringbuffer("immutable");

可見,final只對引用的「值」(也即它所指向的那個物件的記憶體位址)有效,它迫使引用只能指向初始指向的那個物件,改變它的指向會導致編譯器錯誤。至於它所指向的物件的變化,final是不負責的。這很類似==操作符:==操作符只負責引用的「值」相等,至於這個位址所指向的物件內容是否相等,==操作符是不管的

理解final問題有很重要的含義。許多程式漏洞都基於此—-final只能保證引用永遠指向固定物件,不能保證那個物件的狀態不變

多執行緒的操作中,乙個物件會被多個執行緒共享或修改,乙個執行緒對物件無意識的修改可能會導致另乙個使用此物件的執行緒崩潰。乙個錯誤的解決方法就是在此物件新建的時候把它宣告為final,意圖使得它「永遠不變」。其實那是徒勞的。

java中final關鍵字

final關鍵字 final 最終 修飾符 final 關鍵字的用法 1.final 關鍵字修飾乙個基本型別的變數時,該變數不能重新賦值,第一次的值為最終的。2.fianl 關鍵字修飾乙個引用型別變數時,該變數不能重新指向新的物件。3.final 關鍵字修飾乙個函式的時候,該函式不能被重寫。4.fi...

Java中final關鍵字

常見四種用法 1.可以用來修飾類 2.可以用來修飾方法 3.可以用來修飾區域性變數 4.可以用來修飾成員變數 一.final關鍵字修飾類 格式 public final class 類名稱 規範 該類不能有任何子類 總結 乙個類如果被final修飾,那麼其所有的成員方法都無法進行覆寫。二.final...

Java中的final關鍵字

當final關鍵字用來修飾乙個類,格式 public final class 類名稱 含義 當前這個類不能含有任何子類。注意 乙個類如果是final的,那麼其中的所有成員方法都無法進行覆蓋重寫。當final關鍵字修飾乙個方法的時候,不能夠被覆蓋重寫。格式 修飾符 final 返回值型別 方法名稱 引...