成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java抽象類與接口的區(qū)別

Ethan815 / 2072人閱讀

摘要:很多常見的面試題都會出諸如抽象類和接口有什么區(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

相關(guān)文章

  • Java抽象類與接口

    摘要:在抽象類中,聲明的是,可是。抽象類只能作為子類的超類,子類繼承抽象類時必須被實(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可...

    mengbo 評論0 收藏0
  • java學(xué)習(xí)(三) —— 面對對象

    摘要:前言是面對對象的語言,因此有必要單獨(dú)紀(jì)錄下對象的各種定義和理解。面對對象基本概述概述是基于面向過程的變成思想,是對面向過程的一種封裝。面對對象開發(fā)就是不斷的創(chuàng)建對象,使用對象,指揮對象做事情。面對對象設(shè)計(jì)其實(shí)就是在管理和維護(hù)對象之間的關(guān)系。 前言 java是面對對象的語言,因此有必要單獨(dú)紀(jì)錄下對象的各種定義和理解。 面對對象,主要包括:面向?qū)ο笏枷?,類與對象及其使用,對象的內(nèi)存圖,成...

    褰辯話 評論0 收藏0
  • Java 面向?qū)ο?/b>

    摘要:自從轉(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)做一個筆記吧。  什么...

    cncoder 評論0 收藏0
  • Java編程基礎(chǔ)10——面向?qū)ο骭多態(tài)&抽象類&接口

    摘要:案例演示抽象類的成員特點(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)行都看父類。 成員方法:編...

    dunizb 評論0 收藏0
  • 第六章-多態(tài)#yyds干貨盤點(diǎ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)舉例: 貓我們可以...

    cheukyin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<