abstract class和interface的區別


轉載:http://blog.csdn.net/shuilv2000/article/details/6030387

abstract class在Java語言中體現了一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在"is-a"關系,即父類和派生類在概念本質上應該是相同的。對於interface來說則不然,並不要求interface的實現者和interface定義在概念本質上是一致的, 僅僅是實現了interface定義的約定而已。

abstract class Door{
     abstract void open();
     abstract void close();
}
interface Door{
     void open();
     void close();
}

其他具體的Door類型可以extends使用abstract class方式定義的Door或者implements使用interface方式定義的Door。
如果現在要求Door還要具有報警的功能。該如何設計針對該例子的類結構呢?
方案一:

abstract class Door{
     abstract void open();
     abstract void close();
     abstract void alarm();
}

或者

interface Door{
     void open();
     void close();
     void alarm();
}

 方案二:

abstract class Door{
     abstract void open();
     abstract void close();
}

interface Alarm{
     void alarm();
}

class Alarm Door extends Door implements Alarm{
     void open(){…}
     void close(){…}
     void alarm(){…}
}

這種實現方式基本上能夠明確的反映出對於問題領域的理解,正確的揭示設計意圖。其實abstract class表示的是"is-a"關系,interface表示的是"like-a"關系,在選擇時可以作為一個依據,當然這是建立在對問題領域的理解上的,比如:如果認為AlarmDoor在概念本質上是報警器,同時又具有Door的功能,那么上述的定義方式就要反過來了。

小結
1.abstract class 在Java中表示的是一種繼承關系,一個類只能使用一次繼承關系。但是,一個類卻可以實現多個interface。
2.在abstract class 中可以有自己的數據成員,也可以有非abstarct的方法,而在interface中,只能夠有靜態的不能被修改的數據成員(也就是必須是static final的,不過在 interface中一般不定義數據成員),所有的方法都是public abstract的。
3.抽象類中的變量默認是 friendly 型,其值可以在子類中重新定義,也可以重新賦值。接口中定義的變量默認是public static final 型,且必須給其賦初值,所以實現類中不能重新定義,也不能改變其值。
4.abstract class和interface所反映出的設計理念不同。其實abstract class表示的是"is-a"關系,interface表示的是"like-a"關系。
5.實現抽象類和接口的類必須實現其中的所有方法。抽象類中可以有非抽象方法。接口中則不能有實現方法。

abstract class 和 interface 是 Java語言中的兩種定義抽象類的方式,它們之間有很大的相似性。但是對於它們的選擇卻又往往反映出對於問題領域中的概念本質的理解、對於設計意圖的反映是否正確、合理,因為它們表現了概念間的不同的關系。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM