Java程序開發(fā)中abstract 和 interface的區(qū)別詳解
先給大家說(shuō)下基本概念
在Java語(yǔ)言中, abstract class 和interface 是支持抽象類定義的兩種機(jī)制。正是由于這兩種機(jī)制的存在,才賦予了Java強(qiáng)大的 面向?qū)ο竽芰?。abstract class和interface之間在對(duì)于抽象類定義的支持方面具有很大的相似性,甚至可以相互替換,因此很多開發(fā)者在進(jìn) 行抽象類定義時(shí)對(duì)于abstract class和interface的選擇顯得比較隨意。其實(shí),兩者之間還是有很大的區(qū)別的,對(duì)于它們的選擇甚至反映出對(duì) 于問題領(lǐng)域本質(zhì)的理解、對(duì)于設(shè)計(jì)意圖的理解是否正確、合理。
abstract class和interface在Java語(yǔ)言中都是用來(lái)進(jìn)行抽象類(本文 中的抽象類并非從abstract class翻譯而來(lái),它表示的是一個(gè)抽象體,而abstract class為Java語(yǔ)言中用于定義抽象類的一種方法, 請(qǐng)讀者注意區(qū)分)定義的,那么什么是抽象類,使用抽象類能為我們帶來(lái)什么好處呢?
在 面向?qū)ο蟮母拍钪?,我們知道所有的?duì)象都是通過(guò)類來(lái)描繪的,但是反過(guò)來(lái)卻不是這樣。并不是 所有的類都是用來(lái)描繪對(duì)象的(把類具體化),如果一個(gè)類中沒有包含足夠的信息來(lái)描繪一個(gè)具體的對(duì)象,這樣的類就是抽象類。抽象類往往用來(lái)表征我們?cè)趯?duì)問題領(lǐng)域進(jìn)行分析、 設(shè)計(jì)中得出的抽象概念,是對(duì)一系列看上去不同,但是本質(zhì)上相同的具體概念的抽象。比如:如果我們進(jìn)行一個(gè)圖形編輯軟件的開發(fā),就會(huì)發(fā)現(xiàn)問題領(lǐng)域存在著圓、 三角形這樣一些具體概念,它們是不同的,但是它們又都屬于形狀這樣一個(gè)概念,形狀這個(gè)概念在問題領(lǐng)域是不存在的,它就是一個(gè)抽象概念。正是因?yàn)槌橄蟮母拍?在問題領(lǐng)域沒有對(duì)應(yīng)的具體概念,所以用以表征抽象概念的抽象類是不能夠?qū)嵗摹?/p>
java開發(fā)里面經(jīng)常會(huì)用到虛函數(shù)和接口,這兩者的區(qū)別是什么呢?
abstract: 子類里面只能繼承一個(gè)父類
interface: 子類可以實(shí)現(xiàn)多個(gè)接口
那什么時(shí)候用abstract,什么時(shí)候用interface呢?
當(dāng)某個(gè)子類和父類是 is a關(guān)系時(shí),比如一個(gè)亞洲人是一個(gè)人,那么一個(gè)亞洲人的子類可以繼承一個(gè)人的父類。
當(dāng)子類和父類是like a關(guān)系時(shí),比如一個(gè)美洲超人像一個(gè)超人,超人的能力不是每個(gè)人都有的,所以不是所有人的屬性,我們不能把超能力歸于人的父類,這時(shí)就可以用interface
代碼例子:
public abstract class Man { public abstract void eat(); } public interface SuperPower { public void superPower(); } public class AsiaMan extends Man { @Override public void eat() { System.out.println("亞洲人用筷子吃"); } } public class AmericanSuperMan extends Man implements SuperPower { public void superPower() { System.out.println("美國(guó)超人會(huì)飛"); } @Override public void eat() { System.out.println("美國(guó)人用刀叉吃"); } } public static void main(String[] args) { Man anAsiaMan = new AsiaMan(); AmericanSuperMan anAmericanSuperMan = new AmericanSuperMan(); anAsiaMan.eat(); anAmericanSuperMan.eat(); anAmericanSuperMan.superPower(); }
運(yùn)行結(jié)果:
美國(guó)人用刀叉吃
美國(guó)超人會(huì)飛
亞洲人用筷子吃
正確的使用abstract和interface有利提高代碼可讀性,當(dāng)人們看到extend時(shí)就會(huì)知道這是一個(gè)is a什么,看到implement時(shí)可以知道這個(gè)類有什么特性like a
相關(guān)文章
解決Java中的java.io.IOException: Broken pipe問題
這篇文章主要介紹了解決Java中 java.io.IOException: Broken pipe的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06springboot集成shiro詳細(xì)總結(jié)
這幾天在看 shiro,用 springboot 集成了一下,下面的這個(gè)例子中主要介紹了 shiro 的認(rèn)證和授權(quán),以及鹽值加密的功能.程序可以運(yùn)行起來(lái).這里只做一個(gè)簡(jiǎn)單的介紹,后續(xù)會(huì)針對(duì)各個(gè)功能做一個(gè)詳細(xì)的介紹,這里不做過(guò)多的贅述,需要的朋友可以參考下2021-05-05Java連接 JDBC基礎(chǔ)知識(shí)(操作數(shù)據(jù)庫(kù):增刪改查)
這篇文章主要介紹了Java連接 JDBC基礎(chǔ)知識(shí),包括操作數(shù)據(jù)庫(kù)之增刪改查操作,需要的朋友可以參考下2021-04-04java排序高級(jí)之選擇排序?qū)崿F(xiàn)方法
這篇文章主要介紹了java排序高級(jí)之選擇排序?qū)崿F(xiàn)方法,較為全面的分析了選擇排序的原理與具體實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02云計(jì)算實(shí)驗(yàn):Java?MapReduce編程
這篇文章主要介紹了云計(jì)算實(shí)驗(yàn):Java?MapReduce編程,?居于Java圍繞MapReduce編程展開詳細(xì)內(nèi)容,文章助大家掌握MapReduce編程,理解MapReduce原理,需要的朋友可以參考一下2021-12-12ConcurrentHashMap是如何實(shí)現(xiàn)線程安全的你知道嗎
這篇文章主要介紹了ConcurrentHashMap是如何實(shí)現(xiàn)線程安全的你知道嗎,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10在IntelliJ IDEA中多線程并發(fā)代碼的調(diào)試方法詳解
這篇文章主要介紹了在IntelliJ IDEA中多線程并發(fā)代碼的調(diào)試方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08