3、java基础:抽象类与接口的区别
抽象類
我們都知道在面向?qū)ο蟮念I(lǐng)域一切都是對象,同時(shí)所有的對象都是通過類來描述的,但是并不是所有的類都是來描述對象的。如果一個(gè)類沒有足夠的信息來描述一個(gè)具體的對象,而需要其他具體的類來支撐它,那么這樣的類我們稱它為抽象類。比如new Animal(),我們都知道這個(gè)是產(chǎn)生一個(gè)動(dòng)物Animal對象,但是這個(gè)Animal具體長成什么樣子我們并不知道,它沒有一個(gè)具體動(dòng)物的概念,所以他就是一個(gè)抽象類,需要一個(gè)具體的動(dòng)物,如狗、貓來對它進(jìn)行特定的描述,我們才知道它長成啥樣。
在面向?qū)ο箢I(lǐng)域由于抽象的概念在問題領(lǐng)域沒有對應(yīng)的具體概念,所以用以表征抽象概念的抽象類是不能實(shí)例化的。
抽象類是用來捕捉子類的通用特性的 。它不能被實(shí)例化,只能被用作子類的超類。抽象類是被用來創(chuàng)建繼承層級里子類的模板。以JDK中的GenericServlet為例:
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {// abstract methodabstract void service(ServletRequest req, ServletResponse res);void init() {// Its implementation }// other method related to Servlet }當(dāng)HttpServlet類繼承GenericServlet時(shí),它提供了service方法的實(shí)現(xiàn):
public class HttpServlet extends GenericServlet {void service(ServletRequest req, ServletResponse res) {// implementation }protected void doGet(HttpServletRequest req, HttpServletResponse resp) {// Implementation }protected void doPost(HttpServletRequest req, HttpServletResponse resp) {// Implementation }// some other methods related to HttpServlet }創(chuàng)建抽象類和抽象方法非常有用,因?yàn)樗麄兛梢允诡惖某橄笮悦鞔_起來,并告訴用戶和編譯器打算怎樣使用他們.抽象類還是有用的重構(gòu)器,因?yàn)樗鼈兪刮覀兛梢院苋菀椎貙⒐卜椒ㄑ刂^承層次結(jié)構(gòu)向上移動(dòng)。
在使用抽象類時(shí)需要注意幾點(diǎn):
- 1、抽象類不能被實(shí)例化,實(shí)例化的工作應(yīng)該交由它的子類來完成,它只需要有一個(gè)引用即可。
- 2、抽象方法必須由子類來進(jìn)行重寫。
- 3、只要包含一個(gè)抽象方法的抽象類,該方法必須要定義成抽象類,不管是否還包含有其他方法。
- 4、抽象類中可以包含具體的方法,當(dāng)然也可以不包含抽象方法。
- 5、子類中的抽象方法不能與父類的抽象方法同名。
- 6、abstract不能與final并列修飾同一個(gè)類。
- 7、abstract 不能與private、static、final或native并列修飾同一個(gè)方法。
接口
接口是抽象方法的集合。如果一個(gè)類實(shí)現(xiàn)了某個(gè)接口,那么它就繼承了這個(gè)接口的抽象方法。這就像契約模式,如果實(shí)現(xiàn)了這個(gè)接口,那么就必須確保使用這些方法。接口只是一種形式,接口自身不能做任何事情。以Externalizable接口為例:
public interface Externalizable extends Serializable {void writeExternal(ObjectOutput out) throws IOException;void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; }當(dāng)你實(shí)現(xiàn)這個(gè)接口時(shí),你就需要實(shí)現(xiàn)上面的兩個(gè)方法:
public class Employee implements Externalizable {int employeeId;String employeeName;@Overridepublic void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {employeeId = in.readInt();employeeName = (String) in.readObject();}@Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeInt(employeeId);out.writeObject(employeeName);} }在使用接口過程中需要注意如下幾個(gè)問題:
- 1、個(gè)Interface的方所有法訪問權(quán)限自動(dòng)被聲明為public。確切的說只能為public,當(dāng)然你可以顯示的聲明為protected、private,但是編譯會(huì)出錯(cuò)!
- 2、接口中可以定義“成員變量”,或者說是不可變的常量,因?yàn)榻涌谥械摹俺蓡T變量”會(huì)自動(dòng)變?yōu)闉閜ublic static final。可以通過類命名直接訪問:ImplementClass.name。
- 3、接口中不存在實(shí)現(xiàn)的方法。
- 4、實(shí)現(xiàn)接口的非抽象類必須要實(shí)現(xiàn)該接口的所有方法。抽象類可以不用實(shí)現(xiàn)。
- 5、不能使用new操作符實(shí)例化一個(gè)接口,但可以聲明一個(gè)接口變量,該變量必須引用(refer to)一個(gè)實(shí)現(xiàn)該接口的類的對象。可以使用 instanceof 檢查一個(gè)對象是否實(shí)現(xiàn)了某個(gè)特定的接口。例如:if(anObject instanceof Comparable){}。
- 6、在實(shí)現(xiàn)多接口的時(shí)候一定要避免方法名的重復(fù)。
二者區(qū)別
| 默認(rèn)的方法實(shí)現(xiàn) | 它可以有默認(rèn)的方法實(shí)現(xiàn) | 接口完全是抽象的。它根本不存在方法的實(shí)現(xiàn) |
| 實(shí)現(xiàn) | 子類使用extends關(guān)鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有聲明的方法的實(shí)現(xiàn)。 | 子類使用關(guān)鍵字implements來實(shí)現(xiàn)接口。它需要提供接口中所有聲明的方法的實(shí)現(xiàn) |
| 構(gòu)造器 | 抽象類可以有構(gòu)造器 | 接口不能有構(gòu)造器 |
| 與正常Java類的區(qū)別 | 除了你不能實(shí)例化抽象類之外,它和普通Java類沒有任何區(qū)別 | 接口是完全不同的類型 |
| 訪問修飾符 | 抽象方法可以有public、protected和default這些修飾符 | 接口方法默認(rèn)修飾符是public。你不可以使用其它修飾符。 |
| main方法 | 抽象方法可以有main方法并且我們可以運(yùn)行它 | 接口沒有main方法,因此我們不能運(yùn)行它。 |
| 多繼承 | 抽象方法可以繼承一個(gè)類和實(shí)現(xiàn)多個(gè)接口 | 接口只可以繼承一個(gè)或多個(gè)其它接口 |
| 速度 | 它比接口速度要快 | 接口是稍微有點(diǎn)慢的,因?yàn)樗枰獣r(shí)間去尋找在類中實(shí)現(xiàn)的方法。 |
| 添加新方法 | 如果你往抽象類中添加新的方法,你可以給它提供默認(rèn)的實(shí)現(xiàn)。因此你不需要改變你現(xiàn)在的代碼。 | 如果你往接口中添加方法,那么你必須改變實(shí)現(xiàn)該接口的類。 |
總結(jié)
- 1、 抽象類在java語言中所表示的是一種繼承關(guān)系,一個(gè)子類只能存在一個(gè)父類,但是可以存在多個(gè)接口。
- 2、 在抽象類中可以擁有自己的成員變量和非抽象類方法,但是接口中只能存在靜態(tài)的不可變的成員數(shù)據(jù)(不過一般都不在接口中定義成員數(shù)據(jù)),而且它的所有方法都是抽象的。
- 3、抽象類和接口所反映的設(shè)計(jì)理念是不同的,抽象類所代表的是“is-a”的關(guān)系,而接口所代表的是“l(fā)ike-a”的關(guān)系。
?
轉(zhuǎn)載于:https://www.cnblogs.com/zupengliu/p/10802514.html
總結(jié)
以上是生活随笔為你收集整理的3、java基础:抽象类与接口的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大牛带你学优化~案例进阶Mysql优化
- 下一篇: 【robot framework日志】更