最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中接口和抽象類的區(qū)別詳解

 更新時(shí)間:2020年07月23日 17:12:14   投稿:newname  
這篇文章主要介紹了Java中接口和抽象類的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

需求:接口是否可繼承接口?抽象類是否可實(shí)現(xiàn)(implements)接口?抽象類是否可繼承實(shí)體類(concrete class)?抽象類中是否可以有靜態(tài)的main方法?

先說明二者的定義,然后聊聊需求,最后分析二者的區(qū)別。

含有abstract修飾符的類即為抽象類,抽象類不能創(chuàng)建實(shí)例對(duì)象。含有抽象方法的類必須定義為abstract class。在abstract class中,方法不必是抽象的,但是抽象方法必須在具體子類中實(shí)現(xiàn),所以,不能有抽象構(gòu)造方法或抽象靜態(tài)方法。子類如果沒有實(shí)現(xiàn)抽象父類中的所有抽象方法,則必須定義為abstract類型。抽象類需要被繼承才能使用,而被final修飾的類無法被繼承,所以abstract和final是不能共存的。

接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認(rèn)為public abstract類型,接口中的成員變量類型默認(rèn)為public static final。

接口可以繼承接口。

抽象類可以實(shí)現(xiàn)(implements)接口。

抽象類可以繼承實(shí)體類。但和實(shí)體類的繼承一樣,也要求父類可繼承,并且擁有子類可以訪問到的構(gòu)造函數(shù)。其實(shí)Object就是個(gè)實(shí)體類,Java的API文檔里,每個(gè)抽象類的條目里都明確寫著直接或間接繼承自O(shè)bject,所以這點(diǎn)是沒有疑問的。

抽象類中可以有靜態(tài)的main方法。下面分析二者的區(qū)別。

備注:只要明白了接口和抽象類的本質(zhì)和作用,這些問題都很好回答,你想想,如果你是java語(yǔ)言的設(shè)計(jì)者,你是否會(huì)提供這樣的支持,如果不提供的話,有什么理由嗎?如果你沒有道理不提供,那答案就是肯定的了。

只有記住抽象類與普通類的區(qū)別就是①不能創(chuàng)建實(shí)例對(duì)象,②允許有abstract方法。也可以這么理解——抽象類就是一個(gè)不能實(shí)例化的普通類,不過如果方法加了abstract,那么就必須在子類里面重寫。

抽象類 接口
方法默認(rèn)實(shí)現(xiàn) 支持 不支持,接口完全是抽象的
實(shí)現(xiàn) 子類使用extends關(guān)鍵字來繼承抽象類。子類如果不是抽象類,需要實(shí)現(xiàn)抽象類中聲明的所有抽象方法 子類使用關(guān)鍵字implements來實(shí)現(xiàn)接口,需要實(shí)現(xiàn)接口中聲明的所有方法
是否有構(gòu)造函數(shù)
與正常Java類的區(qū)別 不能實(shí)例化抽象類,因?yàn)橛衋bstract方法 接口是完全不同的類型
訪問修飾符 public、protected和default 只有public
main方法 支持 不支持
多繼承 繼承一個(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)該接口的類

抽象類為什么不能實(shí)例化對(duì)象?

現(xiàn)實(shí)生活中也有抽象類的例子,比如說人類是一個(gè)抽象類,無法創(chuàng)建一個(gè)稱作人類的對(duì)象,但是,人可以在繼承人類后來創(chuàng)建對(duì)象。況且抽象類中的抽象方法只有聲明,沒有主體,如果實(shí)例化了,又如何去實(shí)現(xiàn)調(diào)用呢?

什么時(shí)候使用抽象類和接口?

  • 如果擁有一些方法并且想讓它們中的一些有默認(rèn)實(shí)現(xiàn),那么使用抽象類吧。
  • 如果想實(shí)現(xiàn)多重繼承,那么必須使用接口。由于Java不支持多繼承,子類不能夠繼承多個(gè)類,但可以實(shí)現(xiàn)多個(gè)接口。因此就可以使用接口來解決它。
  • 如果基本功能在不斷改變,那么就需要使用抽象類。如果不斷改變基本功能并且使用接口,那么就需要改變所有實(shí)現(xiàn)了該接口的類。

下面接著再說說兩者在應(yīng)用上的區(qū)別。接口更多的是在系統(tǒng)架構(gòu)設(shè)計(jì)方法發(fā)揮作用,主要用于定義模塊之間的通信契約。而抽象類在代碼實(shí)現(xiàn)方面發(fā)揮作用,可以實(shí)現(xiàn)代碼的重用,例如,模板方法設(shè)計(jì)模式是抽象類的一個(gè)典型應(yīng)用,假設(shè)某個(gè)項(xiàng)目的所有HTTP請(qǐng)求都要用相同的方式進(jìn)行權(quán)限判斷、訪問日志記錄和異常處理,那么就可以定義一個(gè)抽象的基類,讓所有的controller都繼承這個(gè)抽象基類,在抽象基類的service方法中實(shí)現(xiàn)上述功能,在各個(gè)子類中只是完成各自的業(yè)務(wù)邏輯代碼,偽代碼如下:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 

public abstract class BaseServlet extends HttpServlet {

  public final void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
   // 記錄訪問日志
   // 進(jìn)行權(quán)限判斷
  } 
   protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException;
   // 注意訪問權(quán)限定義成protected,顯得既專業(yè),又嚴(yán)謹(jǐn),因?yàn)樗菍iT給子類用的
} 

class MyServlet1 extends BaseServlet {
   protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
   // 本Servlet只處理的具體業(yè)務(wù)邏輯代碼
   }
}

父類方法中間的某段代碼不確定,留給子類干,就用模板方法設(shè)計(jì)模式。

備注:這道題的思路是先從總體解釋抽象類和接口的基本概念,然后再比較兩者的語(yǔ)法細(xì)節(jié),最后再說兩者的應(yīng)用區(qū)別。比較兩者語(yǔ)法細(xì)節(jié)區(qū)別的條理是:先從一個(gè)類中的構(gòu)造方法、普通成員變量和方法(包括抽象方法),靜態(tài)變量和方法,繼承性等6個(gè)方面逐一去比較回答,接著從第三者繼承的角度的回答,特別是最后用了一個(gè)典型的例子來展現(xiàn)自己深厚的技術(shù)功底。

到此這篇關(guān)于Java中接口和抽象類的區(qū)別詳解的文章就介紹到這了,更多相關(guān)Java 接口 抽象類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatisPlus更新策略導(dǎo)致更新失敗問題

    mybatisPlus更新策略導(dǎo)致更新失敗問題

    這篇文章主要介紹了mybatisPlus更新策略導(dǎo)致更新失敗問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 詳談java中int和Integer的區(qū)別及自動(dòng)裝箱和自動(dòng)拆箱

    詳談java中int和Integer的區(qū)別及自動(dòng)裝箱和自動(dòng)拆箱

    這篇文章主要介紹了詳談java中int和Integer的區(qū)別及自動(dòng)裝箱和自動(dòng)拆箱,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • ArrayList集合初始化及擴(kuò)容方式

    ArrayList集合初始化及擴(kuò)容方式

    這篇文章主要介紹了關(guān)于ArrayList集合初始化及擴(kuò)容方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java SpringBoot開發(fā)小技巧詳解

    Java SpringBoot開發(fā)小技巧詳解

    這篇文章主要介紹了淺談SpringBoot項(xiàng)目如何讓前端開發(fā)提高效率(小技巧),主要介紹了Swagger和Nginx提高效率的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • springboot 實(shí)現(xiàn)長(zhǎng)鏈接轉(zhuǎn)短鏈接的示例代碼

    springboot 實(shí)現(xiàn)長(zhǎng)鏈接轉(zhuǎn)短鏈接的示例代碼

    短鏈接服務(wù)通過將長(zhǎng)URL轉(zhuǎn)換成6位短碼,并存儲(chǔ)長(zhǎng)短鏈接對(duì)應(yīng)關(guān)系到數(shù)據(jù)庫(kù)中,用戶訪問短鏈接時(shí),系統(tǒng)通過查詢數(shù)據(jù)庫(kù)并重定向到原始URL,實(shí)現(xiàn)快速訪問,本文就來介紹一下如何使用,感興趣的可以了解一下
    2024-09-09
  • Java中實(shí)現(xiàn)線程的超時(shí)中斷方法實(shí)例

    Java中實(shí)現(xiàn)線程的超時(shí)中斷方法實(shí)例

    之前在使用Java實(shí)現(xiàn)熔斷降級(jí)組件的時(shí)候,需要實(shí)現(xiàn)接口請(qǐng)求的超時(shí)中斷,通過查找相關(guān)資料了解了相關(guān)的方法,下面這篇文章主要給大家介紹了關(guān)于Java中實(shí)現(xiàn)線程的超時(shí)中斷的相關(guān)資料,需要的朋友可以參考下
    2018-06-06
  • Java如何去掉指定字符串的開頭的指定字符

    Java如何去掉指定字符串的開頭的指定字符

    這篇文章主要介紹了Java去掉指定字符串的開頭的指定字符操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 徹底了解java中ReentrantLock和AQS的源碼

    徹底了解java中ReentrantLock和AQS的源碼

    這篇文章主要介紹了徹底了解java中ReentrantLock和AQS的源碼,想了解鎖機(jī)制的同學(xué),一定要參考下
    2021-04-04
  • SpringBoot請(qǐng)求轉(zhuǎn)發(fā)的方式小結(jié)

    SpringBoot請(qǐng)求轉(zhuǎn)發(fā)的方式小結(jié)

    本文主要介紹了SpringBoot請(qǐng)求轉(zhuǎn)發(fā)的方式,一共有兩大類,一種是controller控制器轉(zhuǎn)發(fā)一種是使用HttpServletRequest進(jìn)行轉(zhuǎn)發(fā),本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2023-09-09
  • Java設(shè)計(jì)模式之模板方法模式詳解

    Java設(shè)計(jì)模式之模板方法模式詳解

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之模板方法模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評(píng)論

江孜县| 安国市| 遂宁市| 彩票| 阿荣旗| 扎赉特旗| 廊坊市| 古蔺县| 什邡市| 馆陶县| 曲靖市| 正镶白旗| 连云港市| 和平区| 海盐县| 磴口县| 溧水县| 攀枝花市| 霍山县| 武威市| 平顶山市| 灌云县| 栾川县| 温泉县| 敦煌市| 伊金霍洛旗| 乐业县| 红安县| 沈丘县| 登封市| 双流县| 舞钢市| 阳春市| 漯河市| 涪陵区| 灵武市| 富民县| 京山县| 密山市| 宜昌市| 新乐市|