隨筆 - 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基礎

          主站蜘蛛池模板: 弥勒县| 家居| 开化县| 宁明县| 桦南县| 南投市| 江阴市| 汕尾市| 合阳县| 巴林右旗| 莱阳市| 平泉县| 河西区| 奉新县| 靖安县| 辽宁省| 白河县| 新竹县| 屏东市| 永靖县| 米易县| 浦东新区| 桃园县| 德阳市| 满洲里市| 镇远县| 华安县| 桂平市| 浑源县| 隆回县| 隆化县| 广饶县| 华宁县| 循化| 永寿县| 财经| 保定市| 苏州市| 深圳市| 临夏县| 自贡市|