java abstract

weixin_33670713發表於2016-10-02

參考
java抽象類和抽象方法
Android開發:抽象類(abstract class)和介面(Interface)的區別
Java基礎篇(一):介面與抽象類
java抽象類和介面的區別,使用場景

如果我們進行一個圖形編輯軟體的開發,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們本質上又都屬於這樣一個概念:形狀,形狀這個概念在問題領域是不存在的,所以形狀就是一個圓形、三角形的抽象類。正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表徵抽象概念的抽象類是不能例項化的。
你可以直接使用普通類來實現同樣的邏輯,但是,讓具體的實現方法和類抽象化,你可以清晰的告訴使用者這個類不能直接使用,它應該作為基類,然後讓子類來實現抽象方法。(模板方法設計模式)

抽象類有點類似“模板”的作用,目的是根據其格式來建立和修改新的類。物件不能由 抽象類直接建立,只可以通過抽象類派生出新的子類,再由其子類來建立物件。當一個類被宣告為抽象類時,要在這個類前面加上修飾符abstract。

在抽象類中的成員方法可以包括一般方法和抽象方法。抽象方法就是以abstract修飾的方法,這種方法只宣告返回的資料型別、方法名稱和所需的引數,沒 有方法體,也就是說抽象方法只需要宣告而不需要實現。當一個方法為抽象方法時,意味著這個方法必須被子類的方法所重寫,否則其子類的該方法仍然是 abstract的,而這個子類也必須是抽象的,即宣告為abstract。

abstract class Animal//定義抽象類
{
   String str;
   Animal(String s)//定義抽象類的一般方法
   { 
     str=s;
   }
   abstract void eat();//定義抽象方法
}

class Horse extends Animal//定義繼承Animal的子類
{
   String str;
   Horse(String s)
   {
      super(s);//呼叫父類的構造方法
   }
   void eat()//重寫父類的抽象方法
   {      
      System.out.println("馬吃草料!");
   }
}

抽象類方式中,抽象類可以擁有任意範圍的成員資料,同時也可以擁有自己的非抽象方法,但是介面方式中,它僅能夠有靜態、不能修改的成員資料(即final static,但是我們一般是不會在介面中使用成員資料),同時它所有的方法都必須是抽象的。在某種程度上來說,介面是抽象類的特殊化。

從設計的層面來看,我覺得抽象類與介面有如下幾個不同點:

  • 抽象層次不同。可以這樣理解,抽象類是對類的抽象,介面是對行為的抽象。抽象類對是類整體進行抽象,包括屬性、行為,而介面是對類區域性(行為)進行抽象。
  • 跨域不同。抽象類所跨域的是具有相似特點的類,而介面可以跨域不同的類。抽象類所體現的是一種繼承關係,要想使得繼承關係合理,父類和派生類之間必須存在"is-a" 關係,即父類和派生類在概念本質上應該是相同的。對於介面則不然,並不要求介面的實現者和介面定義在概念本質上是一致的, 僅僅是實現了介面定義的契約而已。

相關文章