<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

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

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

        看如下代碼:

    abstract class Class1
    {
       
    abstract void method();
    }

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


    class Class1
    {
       
    abstract void method();
    }

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

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


    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 銀河使者 閱讀(1591) 評論(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
    主站蜘蛛池模板: 国产高清免费视频| 日韩亚洲精品福利| 亚洲真人日本在线| 亚洲成人高清在线观看| 美女视频免费看一区二区| 久久精品一本到99热免费| 在线免费观看韩国a视频| 亚洲爆乳精品无码一区二区三区| 亚洲国产熟亚洲女视频| 成在人线av无码免费高潮水 | 久久狠狠躁免费观看| 日本久久久免费高清| 亚洲综合精品一二三区在线| 美女视频黄频a免费大全视频| 99久久99久久精品免费观看| 亚洲国产成人精品91久久久| 亚洲国产片在线观看| 国产中文字幕在线免费观看| 国产精品免费视频一区| 亚洲码一区二区三区| 中国一级毛片免费看视频| 美女被免费视频网站a国产| 亚洲黑人嫩小videos| 亚洲日韩在线观看免费视频| 夭天干天天做天天免费看| 99久久亚洲综合精品成人网| 亚洲免费在线观看| 国产在线观看免费完整版中文版| 亚洲成无码人在线观看| a级毛片免费完整视频| 亚洲国产综合无码一区二区二三区 | 亚洲国产婷婷综合在线精品| 亚洲人成77777在线播放网站不卡| 好久久免费视频高清| 亚洲无码黄色网址| 国产成人综合亚洲绿色| 国语成本人片免费av无码| 久久亚洲国产精品成人AV秋霞 | 我要看免费的毛片| 亚洲成A∨人片在线观看无码| 毛片在线播放免费观看|