隨筆 - 30, 文章 - 0, 評論 - 27, 引用 - 0
          數據加載中……

          final關鍵字到底修飾了什么

          final使得被修飾的變量"不變",但是由于對象型變量的本質是“引用”,使得“不變”也有了兩種含義:引用本身的不變,和引用指向的對象不變。

            引用本身的不變:
            final StringBuffer a=new StringBuffer("immutable");
            final StringBuffer b=new StringBuffer("not immutable");
            a=b;//編譯期錯誤

            引用指向的對象不變:
            final StringBuffer a=new StringBuffer("immutable");
            a.append(" broken!"); //編譯通過

            可見,final只對引用的“值”(也即它所指向的那個對象的內存地址)有效,它迫使引用只能指向初始指向的那個對象,改變它的指向會導致編譯期錯誤。至于它所指向的對象的變化,final是不負責的。這很類似==操作符:==操作符只負責引用的“值”相等,至于這個地址所指向的對象內容是否相等,==操作符是不管的。

            理解final問題有很重要的含義。許多程序漏洞都基于此----final只能保證引用永遠指向固定對象,不能保證那個對象的狀態不變。在多線程的操作中,一個對象會被多個線程共享或修改,一個線程對對象無意識的修改可能會導致另一個使用此對象的線程崩潰。一個錯誤的解決方法就是在此對象新建的時候把它聲明為final,意圖使得它“永遠不變”。其實那是徒勞的。


          文章來源:http://www.cnblogs.com/rodney/archive/2005/08/18/217458.html

          posted on 2008-01-17 10:06 石業海 閱讀(375) 評論(0)  編輯  收藏 所屬分類: JAVA基礎

          主站蜘蛛池模板: 甘孜县| 金昌市| 兴国县| 巧家县| 沁水县| 九龙县| 永嘉县| 宜州市| 静安区| 徐州市| 揭阳市| 红原县| 阳朔县| 治县。| 义马市| 道孚县| 隆安县| 宁国市| 庆安县| 吉木萨尔县| 内乡县| 临邑县| 黑龙江省| 巨鹿县| 名山县| 平阴县| 贵南县| 卓尼县| 商水县| 洮南市| 墨竹工卡县| 镇安县| 阜阳市| 枣强县| 诸暨市| 雅江县| 尼木县| 五台县| 阳曲县| 铁力市| 长宁区|