摘要:很多常見的面試題都會出諸如抽象類和接口有什么區(qū)別,什么情況下會使用抽象類和什么情況你會使用接口這樣的問題。在討論它們之間的不同點(diǎn)之前,我們先看看抽象類接口各自的特性。抽象類抽象類是用來捕捉子類的通用特性的。
很多常見的面試題都會出諸如抽象類和接口有什么區(qū)別,什么情況下會使用抽象類和什么情況你會使用接口這樣的問題。本文我們將仔細(xì)討論這些話題。
在討論它們之間的不同點(diǎn)之前,我們先看看抽象類、接口各自的特性。
抽象類
抽象類是用來捕捉子類的通用特性的 。它不能被實(shí)例化,只能被用作子類的超類。抽象類是被用來創(chuàng)建繼承層級里子類的模板。以JDK中的GenericServlet為例:
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { // abstract method abstract void service(ServletRequest req, ServletResponse res); void init() { // Its implementation } // other method related to Servlet }
當(dāng)HttpServlet類繼承GenericServlet時,它提供了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 }
接口
接口是抽象方法的集合。如果一個類實(shí)現(xiàn)了某個接口,那么它就繼承了這個接口的抽象方法。這就像契約模式,如果實(shí)現(xiàn)了這個接口,那么就必須確保使用這些方法。接口只是一種形式,接口自身不能做任何事情。以Externalizable接口為例:
public interface Externalizable extends Serializable { void writeExternal(ObjectOutput out) throws IOException; void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; }
當(dāng)你實(shí)現(xiàn)這個接口時,你就需要實(shí)現(xiàn)上面的兩個方法:
public class Employee implements Externalizable { int employeeId; String employeeName; @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { employeeId = in.readInt(); employeeName = (String) in.readObject(); } @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeInt(employeeId); out.writeObject(employeeName); } }
抽象類和接口的對比
參數(shù) | 抽象類 | 接口 |
---|---|---|
默認(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)行它。 |
多繼承 | 抽象方法可以繼承一個類和實(shí)現(xiàn)多個接口 | 接口只可以繼承一個或多個其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有點(diǎn)慢的,因?yàn)樗枰獣r間去尋找在類中實(shí)現(xiàn)的方法。 |
添加新方法 | 如果你往抽象類中添加新的方法,你可以給它提供默認(rèn)的實(shí)現(xiàn)。因此你不需要改變你現(xiàn)在的代碼。 | 如果你往接口中添加方法,那么你必須改變實(shí)現(xiàn)該接口的類。 |
什么時候使用抽象類和接口
如果你擁有一些方法并且想讓它們中的一些有默認(rèn)實(shí)現(xiàn),那么使用抽象類吧。
如果你想實(shí)現(xiàn)多重繼承,那么你必須使用接口。由于Java不支持多繼承,子類不能夠繼承多個類,但可以實(shí)現(xiàn)多個接口。因此你就可以使用接口來解決它。
如果基本功能在不斷改變,那么就需要使用抽象類。如果不斷改變基本功能并且使用接口,那么就需要改變所有實(shí)現(xiàn)了該接口的類。
Java8中的默認(rèn)方法和靜態(tài)方法
Oracle已經(jīng)開始嘗試向接口中引入默認(rèn)方法和靜態(tài)方法,以此來減少抽象類和接口之間的差異?,F(xiàn)在,我們可以為接口提供默認(rèn)實(shí)現(xiàn)的方法了并且不用強(qiáng)制子類來實(shí)現(xiàn)它。這類內(nèi)容我將在下篇博客進(jìn)行闡述。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76423.html
摘要:在抽象類中,聲明的是,可是。抽象類只能作為子類的超類,子類繼承抽象類時必須被實(shí)現(xiàn)。它根本不存在方法的實(shí)現(xiàn)實(shí)現(xiàn)子類使用關(guān)鍵字來繼承抽象類。添加新方法如果你往抽象類中添加新的方法,你可以給它提供默認(rèn)的實(shí)現(xiàn)。轉(zhuǎn)自,抽象類與接口的區(qū)別 抽象類與接口 抽象類與接口一樣,都不能被實(shí)例化,可以有具體實(shí)現(xiàn)的方法,也可以有抽象的方法。在抽象類中,聲明的field是static、final,method可...
摘要:前言是面對對象的語言,因此有必要單獨(dú)紀(jì)錄下對象的各種定義和理解。面對對象基本概述概述是基于面向過程的變成思想,是對面向過程的一種封裝。面對對象開發(fā)就是不斷的創(chuàng)建對象,使用對象,指揮對象做事情。面對對象設(shè)計(jì)其實(shí)就是在管理和維護(hù)對象之間的關(guān)系。 前言 java是面對對象的語言,因此有必要單獨(dú)紀(jì)錄下對象的各種定義和理解。 面對對象,主要包括:面向?qū)ο笏枷?,類與對象及其使用,對象的內(nèi)存圖,成...
摘要:自從轉(zhuǎn)到前段,差不多有一年時間沒有動了,今天老弟問我關(guān)于的面向?qū)ο?,自己不敢直接回答了,也許自己真的應(yīng)該去做相關(guān)的考究了。要有父類引用指向子類對象。外部類要訪問內(nèi)部類的成員,必須要建立內(nèi)部類的對象。 自從轉(zhuǎn)到前段,差不多有一年時間沒有動Java了,今天老弟問我關(guān)于Java的面向?qū)ο?,自己不敢直接回答了,也許自己真的應(yīng)該去做相關(guān)的考究了。然后在告訴他吧,記在這里當(dāng)做一個筆記吧。 什么...
摘要:案例演示抽象類的成員特點(diǎn)抽象類的成員方法特性抽象方法強(qiáng)制要求子類做的事情。抽象類中定義的是該繼承體系的共性功能。 1.多態(tài)的概述及其成員訪問特點(diǎn)代碼體現(xiàn) A:多態(tài)(polymorphic)概述 事物存在的多種形態(tài) B:多態(tài)前提- 1.要有繼承關(guān)系 2.要有方法重寫 3.要有父類引用指向子類對象。 C:多態(tài)中的成員訪問特點(diǎn)之 成員變量:編譯和運(yùn)行都看父類。 成員方法:編...
摘要:多態(tài)多態(tài)概述同一個對象,在不同時刻表現(xiàn)出來的不同形態(tài)舉例貓我們可以說貓是貓貓貓我們也可以說貓是動物動物貓這里貓?jiān)诓煌臅r刻表現(xiàn)出來了不同的形態(tài),這就是多態(tài)多態(tài)的前提和體現(xiàn)有繼承實(shí)現(xiàn)關(guān)系有方法重寫有父類引用指向子類對象多態(tài)中成員訪 1 多態(tài)1.1 多態(tài)概述同一個對象,在不同時刻表現(xiàn)出來的不同形態(tài)舉例: 貓我們可以...
閱讀 2275·2021-11-22 09:34
閱讀 2070·2021-09-22 15:22
閱讀 2049·2019-08-29 15:05
閱讀 2141·2019-08-26 10:43
閱讀 3437·2019-08-26 10:26
閱讀 926·2019-08-23 18:29
閱讀 3551·2019-08-23 16:42
閱讀 2023·2019-08-23 14:46