隨筆 - 312, 文章 - 14, 評(píng)論 - 1393, 引用 - 0
          數(shù)據(jù)加載中……

          為什么要在定義抽象類時(shí)使用abstract關(guān)鍵字

          本文為原創(chuàng),如需轉(zhuǎn)載,請(qǐng)注明作者和出處,謝謝!

              眾所周之,在任何面向?qū)ο蟮恼Z(yǔ)言中(包括JavaC#),在定義抽象類時(shí)必須使用abstract關(guān)鍵字。雖然這已經(jīng)習(xí)已為常了,但實(shí)際上abstract是為了在實(shí)現(xiàn)接口或繼承抽象類避免歧議而必須存在的。

              看如下代碼:

          abstract class Class1
          {
             
          abstract void method();
          }

              上面的代碼是一個(gè)典型的抽象類,在定義類時(shí)和定義方法時(shí)都使用了abstract。但從編譯器的角度來(lái)說(shuō),在定義類時(shí)完全可以不使用abstract,如下面的代碼所示:


          class Class1
          {
             
          abstract void method();
          }

              對(duì)于上面的代碼,編譯器在編譯時(shí)并不會(huì)產(chǎn)生奇異,只要檢測(cè)到類中有一個(gè)用abstract關(guān)鍵字的代碼,就可以在編譯的過程中自動(dòng)向Class1添加abstract,也就是說(shuō),在定義Class1時(shí)添加abstract的工作應(yīng)該由編譯器來(lái)完成。

              雖然上面的過程看起來(lái)沒什么問題,也并不難實(shí)現(xiàn),但各位不要忘了,實(shí)現(xiàn)抽象類除了上面的方式,還有另外一種方式,這就是實(shí)現(xiàn)接口,而并不實(shí)現(xiàn)接口中的所有方法。看下面的代碼:


          interface MyInterface
          {
              
          public void method1();
              
          public void method2();
          }
          abstract class MyClass implements MyInterface
          {
              
          public void method1()
              {
                  
              }
          }

              上面代碼中MyClass類并未實(shí)現(xiàn)method2方法,也并示在定義方法時(shí)使用abstract關(guān)鍵字,然后,method2方法實(shí)際上就是abstract方法。

             大家可以想象,如果在定義抽象類時(shí)不使用abstract關(guān)鍵字會(huì)怎么樣呢?看下面的代碼:


          interface MyInterface
          {
              
          public void method1();
              
          public void method2();
          }
          class MyClass implements MyInterface
          {
              
          public void method1()
              {
                  
              }
          }

              上面的代碼一定會(huì)編譯出錯(cuò)的,因?yàn)榫幾g器蒙了。在面向?qū)ο笳Z(yǔ)言中規(guī)定,一個(gè)普通類必須實(shí)現(xiàn)接口中的所有方法。而在上面的代碼中,method2方法未實(shí)現(xiàn)。而編譯器無(wú)法判斷MyClass類是抽象類,還是普通類。如果按著普通類來(lái)處理,則會(huì)編譯出錯(cuò),如果按著抽象類來(lái)處理,則完全符合面向?qū)ο笠?guī)則。因此,就產(chǎn)生了歧議。當(dāng)編譯器在編譯源代碼時(shí),一定會(huì)產(chǎn)生錯(cuò)誤,否則可能會(huì)編譯成和源代碼的含義不同的二進(jìn)制目標(biāo)文件。

              當(dāng)然,上面的代碼也可以設(shè)置默認(rèn)的規(guī)則,也就是按著普通類處理不通過時(shí),就按著抽象類來(lái)處理。但這又會(huì)帶來(lái)另一個(gè)問題。如果開發(fā)人員忘記實(shí)現(xiàn)某個(gè)接口的方法,那不是這個(gè)類就會(huì)被編譯器認(rèn)為是抽象類了嗎?因此,為了保險(xiǎn)起見,編譯器的設(shè)計(jì)者特意為抽象類指定一個(gè)abstract關(guān)鍵字,也就是說(shuō),這個(gè)類是否是抽象類,應(yīng)由開發(fā)人員通過編碼的方式來(lái)指定,而不是由編譯器自做主張。

              從上面的描述可以看出,加abstract關(guān)鍵字主要是為了避免普通類在實(shí)現(xiàn)接口時(shí)產(chǎn)生的歧議。如果假設(shè)面向?qū)ο笳Z(yǔ)言中沒有接口,abstract關(guān)鍵字完全可以去掉。當(dāng)然,繼承抽象類也和實(shí)現(xiàn)接口類似。

              象面向?qū)ο笳Z(yǔ)言中的靜態(tài)方法很多就沒有靜態(tài)類的概念(Java沒有,C#有)。因此,在定義類時(shí)加不加static,并不會(huì)產(chǎn)生奇異,所以static關(guān)鍵字在定義靜態(tài)類時(shí)也就不是必須的了。






          Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺(tái)灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2008-09-30 14:31 銀河使者 閱讀(1592) 評(píng)論(4)  編輯  收藏 所屬分類: java 原創(chuàng)

          評(píng)論

          # re: 為什么要在定義抽象類時(shí)使用abstract關(guān)鍵字  回復(fù)  更多評(píng)論   

          語(yǔ)義分析的二義性問題咯
          2008-09-30 15:49 | dennis

          # re: 為什么要在定義抽象類時(shí)使用abstract關(guān)鍵字  回復(fù)  更多評(píng)論   

          歸納一下:
          1.abstract關(guān)鍵字主要是為了避免普通類在實(shí)現(xiàn)接口時(shí)產(chǎn)生的歧議
          2.類是否是抽象類,應(yīng)由開發(fā)人員通過編碼的方式來(lái)指定,而不是由編譯器自做主張
          2008-09-30 16:30 | flyterren

          # re: 為什么要在定義抽象類時(shí)使用abstract關(guān)鍵字  回復(fù)  更多評(píng)論   

          很有道理!
          2008-10-06 12:19 | 于翔

          # re: 為什么要在定義抽象類時(shí)使用abstract關(guān)鍵字  回復(fù)  更多評(píng)論   

          好,學(xué)習(xí)了
          俺是初學(xué)者!
          2008-10-22 16:21 | lyshyhaungli
          主站蜘蛛池模板: 孟村| 于田县| 黎城县| 龙口市| 惠东县| 辉南县| 金沙县| 睢宁县| 佛冈县| 静海县| 霍林郭勒市| 射洪县| 丽江市| 广南县| 开江县| 彭阳县| 楚雄市| 华宁县| 桂东县| 正阳县| 淮南市| 深州市| 开平市| 东阳市| 房产| 桂平市| 滨海县| 伊金霍洛旗| 平利县| 六盘水市| 逊克县| 彭山县| 海原县| 仙居县| 蓝山县| 蒙自县| 麻阳| 永清县| 如皋市| 莱州市| 文登市|