weidagang2046的專欄

          物格而后知致
          隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
          數(shù)據(jù)加載中……

          小議final關(guān)鍵字

          finalJava語言中一個很微妙的關(guān)鍵字,而使用它通常出于兩種理由:設(shè)計與效率。我們可以對數(shù)據(jù)成員、方法和類使用final關(guān)鍵字。
             
          final數(shù)據(jù)的聲明是為了告訴編譯器有一塊數(shù)據(jù)是恒定不變的。對于基本數(shù)據(jù)類型,編譯器可以將該常量值代入任何可能用到它的計算式中去,即可以在編譯時執(zhí)行計算,這樣就減輕了一些運(yùn)行時的負(fù)擔(dān)。在對這個常量進(jìn)行定義的時候,必須對其進(jìn)行賦值,當(dāng)然也可以在類的構(gòu)造函數(shù)中賦值。當(dāng)對對象引用使用final聲明時,其含義容易讓人迷惑,因為對于對象的引用,final可以使引用恒定不變,它可以使該引用始終指向一個對象,但是,對象自身是可以被修改的,所以在這種情況下感覺final幾乎沒什么作用,數(shù)組也是對象,它也存在這種情況,通過下面這個例子說明:


          class Fruit {

            
          private final int[] m = {123};

            
          public static void main(String[] args) {

          Fruit f 
          = new Fruit();

          for(int i = 0; i < m.length(); i++) {

            f.m[i]
          ++;  //可以改變

          }

          f.m 
          = new int[5];  //不能指向另外的一個對象,錯誤!

          }

          }


              對基本數(shù)據(jù)類型的數(shù)據(jù)使用final的另外一個用處就是可以做到根據(jù)對象的不同而使類的功能發(fā)生改變,例如:

           

          class Apple {

            
          private final int i;  //沒有初始化,需要在構(gòu)造函數(shù)中賦值

            
          private static Random r = new Random();

            
          public Apple() {

              i 
          = r.newInt(10);

          }

          public Apple(int j) {

            i 
          += j;

          }

          }


              使用final方法,可以把方法鎖定,防止繼承類修改它。并且使用方法類在一般情況下可以提高效率,讓編譯器將針對該方法的所有調(diào)用都轉(zhuǎn)為內(nèi)嵌式的調(diào)用,即以方法體中的實際代碼來代替方法調(diào)用的代碼,這樣就消除了方法調(diào)用的開銷。但是對于private類型的方法而言意義不大,因為private方法都已經(jīng)被隱式的制定為final,如果繼承類試圖將該方法聲明為public/protected/默認(rèn)的同名方法,將不能覆蓋基類中的方法,這樣做是聲明了一個新的方法,這是Java中的多態(tài),但是也說明了private方法將不會起到什么作用。
             
          final類的設(shè)計是為了防止以后對該類進(jìn)行變動,并不希望它有子類,在final類中所有的方法都隱式指定為final的,并且這些方法無法被覆蓋,而final類的字段將保持原義,不受final類的影響!

             
          這段時間在重新復(fù)習(xí)Java中的基本細(xì)節(jié)與概念,歡迎拍磚!共同學(xué)習(xí)!

          from: http://www.aygfsteel.com/flyingis/archive/2005/10/28/17274.html

          posted on 2005-11-01 22:40 weidagang2046 閱讀(121) 評論(0)  編輯  收藏 所屬分類: Java

          主站蜘蛛池模板: 漳浦县| 商都县| 个旧市| 大同县| 兰溪市| 科技| 汶上县| 恩平市| 冀州市| 丹东市| 舟山市| 瑞安市| 九江市| 安徽省| 迁西县| 宁城县| 高雄县| 海淀区| 泾阳县| 咸阳市| 威海市| 客服| 安顺市| 商城县| 鸡西市| 达尔| 海口市| 盐山县| 汕尾市| 海林市| 泸西县| 积石山| 宁远县| 敦煌市| 大庆市| 调兵山市| 芦山县| 安乡县| 黄平县| 镇巴县| 仁怀市|