隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

          為什么要在定義抽象類時使用abstract關鍵字

          本文為原創,如需轉載,請注明作者和出處,謝謝!

              眾所周之,在任何面向對象的語言中(包括JavaC#),在定義抽象類時必須使用abstract關鍵字。雖然這已經習已為常了,但實際上abstract是為了在實現接口或繼承抽象類避免歧議而必須存在的。

              看如下代碼:

          abstract class Class1
          {
             
          abstract void method();
          }

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


          class Class1
          {
             
          abstract void method();
          }

              對于上面的代碼,編譯器在編譯時并不會產生奇異,只要檢測到類中有一個用abstract關鍵字的代碼,就可以在編譯的過程中自動向Class1添加abstract,也就是說,在定義Class1時添加abstract的工作應該由編譯器來完成。

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


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

              上面代碼中MyClass類并未實現method2方法,也并示在定義方法時使用abstract關鍵字,然后,method2方法實際上就是abstract方法。

             大家可以想象,如果在定義抽象類時不使用abstract關鍵字會怎么樣呢?看下面的代碼:


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

              上面的代碼一定會編譯出錯的,因為編譯器蒙了。在面向對象語言中規定,一個普通類必須實現接口中的所有方法。而在上面的代碼中,method2方法未實現。而編譯器無法判斷MyClass類是抽象類,還是普通類。如果按著普通類來處理,則會編譯出錯,如果按著抽象類來處理,則完全符合面向對象規則。因此,就產生了歧議。當編譯器在編譯源代碼時,一定會產生錯誤,否則可能會編譯成和源代碼的含義不同的二進制目標文件。

              當然,上面的代碼也可以設置默認的規則,也就是按著普通類處理不通過時,就按著抽象類來處理。但這又會帶來另一個問題。如果開發人員忘記實現某個接口的方法,那不是這個類就會被編譯器認為是抽象類了嗎?因此,為了保險起見,編譯器的設計者特意為抽象類指定一個abstract關鍵字,也就是說,這個類是否是抽象類,應由開發人員通過編碼的方式來指定,而不是由編譯器自做主張。

              從上面的描述可以看出,加abstract關鍵字主要是為了避免普通類在實現接口時產生的歧議。如果假設面向對象語言中沒有接口,abstract關鍵字完全可以去掉。當然,繼承抽象類也和實現接口類似。

              象面向對象語言中的靜態方法很多就沒有靜態類的概念(Java沒有,C#有)。因此,在定義類時加不加static,并不會產生奇異,所以static關鍵字在定義靜態類時也就不是必須的了。






          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          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) 評論(4)  編輯  收藏 所屬分類: java 原創

          評論

          # re: 為什么要在定義抽象類時使用abstract關鍵字  回復  更多評論   

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

          # re: 為什么要在定義抽象類時使用abstract關鍵字  回復  更多評論   

          歸納一下:
          1.abstract關鍵字主要是為了避免普通類在實現接口時產生的歧議
          2.類是否是抽象類,應由開發人員通過編碼的方式來指定,而不是由編譯器自做主張
          2008-09-30 16:30 | flyterren

          # re: 為什么要在定義抽象類時使用abstract關鍵字  回復  更多評論   

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

          # re: 為什么要在定義抽象類時使用abstract關鍵字  回復  更多評論   

          好,學習了
          俺是初學者!
          2008-10-22 16:21 | lyshyhaungli
          主站蜘蛛池模板: 仙居县| 景东| 西青区| 罗定市| 蕉岭县| 黄石市| 漯河市| 泗阳县| 沐川县| 玛沁县| 台前县| 淮阳县| 玉龙| 宝应县| 固始县| 双牌县| 谷城县| 南川市| 新宁县| 梁平县| 益阳市| 焦作市| 永丰县| 微山县| 砀山县| 伊吾县| 北辰区| 碌曲县| 眉山市| 新沂市| 甘肃省| 安吉县| 安多县| 庆安县| 治县。| 施甸县| 嘉义县| 太谷县| 德清县| 广昌县| 郓城县|