91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java抽象類和接口的區別有哪些

發布時間:2021-11-18 10:09:58 來源:億速云 閱讀:143 作者:iii 欄目:編程語言

這篇文章主要講解了“java抽象類和接口的區別有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“java抽象類和接口的區別有哪些”吧!

部分來自:Java抽象類與接口的區別-ImportNew

抽象類 —— 一種模板式設計

abstract void fun();
[public] abstract class ClassName {
    abstract void fun();
}
  • 抽象類就是為了繼承而存在

  1. 抽象類不能被實例化,實例化 交由它的子類完成,它只需要有一個引用即可。

  2. 抽象方法由子類來進行重寫。必須為public或者protected,缺省情況下默認為public

  3. 只要包含一個抽象方法的抽象類,該方法必須要定義成抽象類,不管是否還包含有其他方法。

  4. 抽象類中可以包含具體的方法,當然也可以不包含抽象方法。

  5. abstract不能與final并列修飾同一個類。

  6. abstract 不能與privatestaticfinalnative并列修飾同一個方法。

  • 抽象類的意義在于:

  1. 為其子類提供一個公共的父類型,避免該類被實例化;

  2. 封裝子類中的重復內容(成員變量和方法);

  3. 定義公共抽象方法,由子類提供不同的實現。

接口 —— 一種輻射式設計(一種行為規范)

[public] interface InterfaceName {

}
  • 接口 本身也是類 

  • 變量  被隱式地指定為 public static final (只能是 public static final 變量,用 private 或 private 修飾會報編譯錯誤)

  • 方法【必須都抽象方法】  被隱式地指定為public abstract (只能是 public abstract 方法) 

  • 接口中所有的方法不能有具體的實現(jdk1.8中可以有default方法和static方法)

接口是一種極度抽象的類型,比抽象類更加“抽象”,并且一般情況下不在接口中定義變量(如果定義只能是Static Final)

對比 —— 

語法層面上的區別

  1)抽象類可以提供成員方法的實現細節,而接口中只能存在public abstract 方法;

  2)抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的;

  3)接口中不能含有靜態代碼塊以及靜態方法,而抽象類可以有靜態代碼塊和靜態方法;

  4)一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。

設計層面上的區別

  1. 什么是模板式設計?例子:用模板A設計了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A,如果公共部分需要改動,則只需要改動模板A就可以了,不需要重新對ppt B和ppt C進行改動

  2. 什么是輻射式設計?比如某個電梯都裝了某種報警器,一旦要更新報警器,就必須全部更新。

抽象類是自底向上抽象而來的,接口是自頂向下設計出來的 

  • 對于抽象類,如果需要添加新的方法,可以直接在抽象類中添加具體的實現,子類可以不進行變更;

  • 而對于接口則不行,如果接口進行了變更,則所有實現這個接口的類都必須進行相應的改動。

抽象類和接口的對比

參數抽象類接口
默認的方法實現它可以有默認的方法實現接口完全是抽象的。它根本不存在方法的實現
實現子類使用extends關鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有聲明的方法的實現。子類使用關鍵字implements來實現接口。它需要提供接口中所有聲明的方法的實現
構造器抽象類可以有構造器接口不能有構造器
與正常Java類的區別除了你不能實例化抽象類之外,它和普通Java類沒有任何區別接口是完全不同的類型
訪問修飾符抽象方法可以有publicprotecteddefault這些修飾符接口方法默認修飾符是public。你不可以使用其它修飾符。
main方法抽象方法可以有 main 方法并且我們可以運行它接口沒有main方法,因此我們不能運行它。
多繼承抽象方法可以繼承一個類和實現多個接口接口只可以繼承一個或多個其它接口
速度它比接口速度要快接口是稍微有點慢的,因為它需要時間去尋找在類中實現的方法。
添加新方法如果你往抽象類中添加新的方法,你可以提供默認的實現。因此你不需要改變你現在的代碼。如果你往接口中添加方法,那么你必須改變實現該接口的類。
什么時候使用抽象類和接口
  • 如果你擁有一些方法并且想讓它們中的一些有默認實現,那么使用抽象類吧。

  • 如果你想實現多重繼承,那么你必須使用接口。由于Java不支持多繼承,子類不能夠繼承多個類,但可以實現多個接口。因此你就可以使用接口來解決它。

  • 如果基本功能在不斷改變,那么就需要使用抽象類。如果不斷改變基本功能并且使用接口,那么就需要改變所有實現了該接口的類。

實例 —— 

門和警報的例子:門都有open( )和close( )兩個動作,此時我們可以定義通過抽象類和接口來定義這個抽象概念:

abstract class Door {
    public abstract void open();
    public abstract void close();
}

或者:

interface Door {
    public abstract void open();
    public abstract void close();
}

        這種方法違反了面向對象設計中的一個核心原則ISP (Interface Segregation Principle)【見批注】,在Door的定義中把Door概念本身固有的行為方法和另外一個概念"報警器"的行為方 法混在了一起。這樣引起的一個問題是那些僅僅依賴于Door這個概念的模塊會因為"報警器"這個概念的改變而改變,反之依然。

Door的open() 、close()和alarm()根本就屬于兩個不同范疇內的行為,open()和close()屬于門本身固有的行為特性,而alarm()屬于延伸的附加行為。因此最好的解決辦法是單獨將報警設計為一個接口,包含alarm()行為,Door設計為單獨的一個抽象類,包含open和close兩種行為。再設計一個報警門繼承Door類和實現Alarm接口。

interface Alram {
    void alarm();
}
 
abstract class Door {
    void open();
    void close();
}
 
class AlarmDoor extends Door implements Alarm {
    void oepn(){
      //....
    }
    void close(){
      //....
    }
    void alarm(){
      //....
    }
}

批注: 

        ISP(Interface Segregation Principle接口分離原則):面向對象的一個核心原則。它表明使用多個專門的接口比使用單一的總接口要好。

       一個類對另外一個類的依賴性應當是建立在最小的接口上的。

       一個接口代表一個角色,不應當將不同的角色都交給一個接口。沒有關系的接口合并在一起,形成一個臃腫的大接口,這是對角色和接口的污染。

感謝各位的閱讀,以上就是“java抽象類和接口的區別有哪些”的內容了,經過本文的學習后,相信大家對java抽象類和接口的區別有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太保市| 肇东市| 余干县| 沙田区| 绍兴市| 西乌珠穆沁旗| 太和县| 九台市| 原平市| 万荣县| 兴仁县| 蛟河市| 长宁县| 宁安市| 剑川县| 高密市| 枣强县| 大冶市| 崇州市| 灵武市| 安国市| 太仆寺旗| 天长市| 安仁县| 罗田县| 滨州市| 兖州市| 垦利县| 奉新县| 镇赉县| 北宁市| 青海省| 忻城县| 如东县| 安国市| 香格里拉县| 贵定县| 克什克腾旗| 晋城| 崇左市| 琼中|