final使得被修飾的變數"不變",但是由於物件型變數的本質是「引用」,使得「不變」也有了兩種含義:
引用本身的不變,和引用指向的物件不變。
引用本身的不變:
final stringbuffer a=new stringbuffer("immutable");
final stringbuffer b=new stringbuffer("not immutable");
a=b;//編譯期錯誤
引用指向的物件不變:
final stringbuffer a=new stringbuffer("immutable");
可見,final只對引用的「值」(也即它所指向的那個物件的記憶體位址)有效,它迫使引用只能指向初始指向的那個物件,改變它的指向會導致編譯期錯誤。至於它所指向的物件的變化,final是不負責的。這很類似==操作符:==操作符只負責引用的「值」相等,至於這個位址所指向的物件內容是否相等,==操作符是不管的。
理解final問題有很重要的含義。許多程式漏洞都基於此----final只能保證引用永遠指向固定物件,不能保證那個物件的狀態不變。在多執行緒的操作中,乙個物件會被多個執行緒共享或修改,乙個執行緒對物件無意識的修改可能會導致另乙個使用此物件的執行緒崩潰。乙個錯誤的解決方法就是在此物件新建的時候把它宣告為final,意圖使得它「永遠不變」。其實那是徒勞的。
Java final 關鍵字到底修飾了什麼?
final使得被修飾的變數 不變 但是由於物件型變數的本質是 引用 使得 不變 也有了兩種含義 引用本身的不變,和引用指向的物件不變。引用本身的不變 inal stringbuffer a new stringbuffer immutable final stringbuffer b new str...
Java final關鍵字 註解
week6 saturday 一 final關鍵字 1 用final修飾的類不能被繼承 2 成員方法加final不能在其他類中重寫此方法 3 被final修飾的資料成員或臨時變數賦值後無法被修改 4 構造方法不能用final修飾 用final修飾的靜態資料成員必須進行初始化 用final修飾的非靜態...
Java final和static關鍵字
繼承的出現提高了 的復用性,並方便開發。但是,有些類在描述完之後,不想被繼承,或者有些類中的部分方法功能是固定的,不想讓子類重寫。可是當子類繼承了這些特殊類之後,就可以對其中的方法進行重寫,這怎麼辦呢?要解決上面的問題,需要用到關鍵字final,final意思是最終,不可變。final是個修飾符,它...