星期五, 7月 08, 2011

介面與抽象

若你真的需要繼承某class,但又希望別人無法new它,就將它宣告成abstract;
若你沒有需要繼承某class,只希望N個class都要求有某些功能,就先宣告一個interface,讓各class去實作它!


筆記: 抽象與介面
抽象(abstract) :
  (1)讓子class一定要去覆寫的方法。
  (2)抽象類別是不能產生物件。
  (3)抽象類別的關鍵字 = abstract;使用extends繼承。
  (4)abstract關鍵字只能用在類別與方法,用在屬性則沒有意義
  (5)抽象方法不需要寫方法的內容,實作是交給繼承此抽象類別的子類
      別來做。
  (6)使用建構子是因為其他屬性還是需要做初始化的動作。

介面(interface) :
  (1)為一種標準、規範,只要節合此介面的規範就能和這個介面溝通。
  (2)沒有建構函數、成員變數必須指定初值
  (3)關鍵字 = interface;使用implements繼承。
  (4)只有方法宣告,沒有實作。(如同抽象,但因介面內的方法全為抽
      象方法,所以不用加abstract關鍵字。)
        ex: public interface face
             {
                 public void sex();
              }
  (5)繼承宣告的方式:
            public class human extends sex implements face
  (6)介面不需要有建構子的存在(因只是做規格、功用的定義宣告,且
      因介面只有類別常數(使用final,但不用寫,因為介面中的變數會
      自動轉)
  (7)利用介面來做多重繼承。(介面繼承介面也是用extends)
  (8)可利用instanceof來判斷某個類別是否實作了某個介面。
  (9)Interface使用時,必須使用裡面所有的方法,不然必須宣告為
      abstract類別

=====================================

比較:
  (1) interface的方法沒有「實作」,abstract能有abstract方法,但
       也沒有「實作」
  (2) interface與abstract類別都不能直接用來建立物件實體,必須由
       一個標準class來繼承他,實作沒有「實作部分」的方法,然後再
       以此建立物件實體。
  (3) interface 沒有建構子,abstract有建構子
  (4) interface 不允許其內任何方法有「實作」,abstract類別允許其
       內非abstract方法有實作。
  (5) interface 沒有內建的super與this變數,abstract有。
  (6) interface 的成員變數一定都是final;abstract類別的成員變數比
       照一般的class。
  (7) interface 所有成員的封裝等級都是public;abstract則可加任何
       封裝等級。