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

Java中的abstract和interface

 更新時間:2021年11月03日 17:23:34   作者:李子捌  
abstract和interface關鍵字在Java中隨處可見,它是Java三大特性封裝、繼承、多態(tài)特性的實現重要支柱之一。interface關鍵字用于定義接口抽象,其本質上是用于定義類型、定義類所具有的能力,下面來看看詳細內容,需要的朋友可以參考一下

1、簡介

abstractinterface關鍵字在Java中隨處可見,它是Java三大特性封裝、繼承、多態(tài)特性的實現重要支柱之一。interface關鍵字用于定義接口抽象,其本質上是用于定義類型、定義類所具有的能力。但是新手往往錯誤的使用了abstract和interface,小捌其實也一樣犯錯誤,這篇文章我們盤一盤interface接口和abstract抽象類的使用。

文章開始前建議帶著兩個疑問閱讀:

  • abstractinterface有什么區(qū)別?
  • abstractinterface應該怎么選?

2、準則

定義接口的時候,有一些準則可以參考,根據這些準則可以更好的確定自己應不應該定義接口、或者是否有其他更好的代替方案。(注意小捌說的點不是絕對正確的,實際開發(fā)過程中要具體分析,有不對的可以互相交流。)

2.1 接口優(yōu)先于抽象類

小捌這里用JDK的源碼HashMap的繼承體系來說明接口優(yōu)先于抽象類這一點。

HashMap繼承體系類圖結構:

HashMap的頂層接口:

public interface Map<K,V>{}

HashMap實現的抽象類:

public abstract class AbstractMap<K,V> implements Map<K,V> {}

可以看到HashMap繼承了AbstractMap抽象類實現了Map接口,但為什么說接口優(yōu)先于抽象類呢?這些因為Java是單繼承多實現,HashMap繼承了AbstractMap抽象類之后就無法繼承其他類了,如果是接口就沒有這個限制,比如HashMap還需要提供序列化和克隆的功能,HashMap就可以實現三個接口Map<K,V>, Cloneable, Serializable
既然這樣為什么HashMap還要去繼承AbstractMap抽象類呢?
這是因為在JDK源碼設計中,Map結構JDK需要提供部分方法的默認實現,因此JDK的作者們單獨拉取了一個抽象類來實現這些方法;盡管Java8 Oracle嘗試在接口中提供靜態(tài)方法和普通方法,但是小捌認為沒有到一定的需求程度,盡量、甚至完全不應該將方法實現定義在接口中。
abstract和interface有什么區(qū)別呢?
其實在Java8之后區(qū)別在不斷的縮小,但是總體上來說還是兩個完全不同的概念:

抽象類abstract的特點:

  • 抽象方法和抽象類都必須被abstract關鍵字修飾
  • 一個類中有抽象方法,那么這個類一定是抽象類
  • 抽象類中不一定有抽象方法
  • 抽象類中可以存在構造方法
  • 抽象類中可以存在普通屬性、方法、靜態(tài)屬性和靜態(tài)方法
  • 抽象類的方法必須在子類中實現,否則子類也需要定義為抽象類
  • 抽象類不可以用new創(chuàng)建對象,因為調用抽象方法沒有實現就沒有意義

接口interface的特點:

  • 接口中的方法,都被public來修飾
  • 接口中沒有構造方法,不能實例化接口對象
  • 接口中只有常量,如果定義變量,則默認加上public static final
  • 使用接口可以實現多繼承
  • 接口中只有方法的聲明,沒有方法體(適用于Java8之前,當我沒說,但是很多人都是這么認為的,這種錯誤的認為往往能正確的設計代碼)
  • 接口中可以聲明靜態(tài)方法,必須是public修飾(默認),靜態(tài)方法無法被子類重寫
  • 接口中可以聲明普通方法,必須是default修飾

比較項 抽象類(abstract) 接口(interface)
多繼承 不支持(只能繼承一個抽象類) 支持(類可以實現很多個接口)
方法 抽象類則可以同時包含抽象和非抽象的方法 接口中所有的方法隱含都是抽象的(Java可以定義靜態(tài)方法)
構造器 允許 不允許
實例化 不能實例化 不能實例化
訪問修飾符 抽象類可以使用public、default;抽象方法可以使用public、default、protected;普通方法可以使用public、default、protected、private 接口可以使用public、default;方法默認public;

總結:

  • 在整個抽象實現體系中,必須提供一些方法的默認實現,可以使用抽象類(因為非常不建議在接口中直接實現某些方法)
  • 如果不需要提供默認實現,且需要實現多繼承的功能就使用接口

2.2 接口中不應該實現方法

接口無處不在,接口作為類體系結構的最頂層,接口提供的一切約束和規(guī)范都是直接影響下層實現類。因此不建議在接口中實現具體的方法,盡管Java8之后的接口定義可以提供靜態(tài)方法實現和普通方法實現,但是這種實現方式有很大的風險,除非你的接口設計真的很完美,完美到能對所有的實現類都負責任的說你的邏輯永遠不會變。要不然接口的具體實現方法邏輯修改后,下面那些使用了該方法的類都得遭殃。
因此接口盡可能的只用來定義類型、定義類所具有的能力。如果一定要定義實現,可以考慮使用抽象類來定義。

2.3 接口不應該用于導出常量

由于接口中定義常量非常方便,因此有一些小伙伴會使用接口直接作為常量導出類,比如如下這種方式:

/**
 * <p>
 *      緩存key
 * </p>
 *
 * @Author: Liziba
 * @Date: 2021/11/2 23:12
 */
public interface CacheKey {

    String USER = "user";

    String ORDER = "order";

    String MAIL = "mail";

}

它雖然看起來非常簡便、使用上也沒什么問題。但是問題就出在接口它不是用來給你導出常量的,如果需要定義常量我們可以使用枚舉或者常量類,

比如如下這種方法:

public class CacheKey {

    public static final String USER = "user";

    public static final String ORDER = "order";

    public static final String MAIL = "mail";

}

注意小捌這里說的是不要拿接口僅僅只作為常量導出類,而不是說不能在接口中定義常量,如果部分常量是類抽象類型中統(tǒng)一使用的可以考慮這樣設計(但是也不推薦啦?。?,單獨抽出常量類來管理這些常量往往要更好一些的。

到此這篇關于Java中的abstractinterface的文章就介紹到這了,更多相關Java中的abstractinterface內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中的內存泄漏

    Java中的內存泄漏

    這篇文章主要介紹了Java中的內存泄漏的相關資料,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下
    2020-11-11
  • mybatis整合springboot報BindingException:Invalid?bound?statement?(not?found)異常解決

    mybatis整合springboot報BindingException:Invalid?bound?stateme

    這篇文章主要給大家介紹了關于mybatis整合springboot報BindingException:Invalid?bound?statement?(not?found)異常的解決辦法,這個錯誤通常是由于Mapper文件中的statement?id與Java代碼中的方法名不一致導致的,需要的朋友可以參考下
    2024-01-01
  • java之Objects.nonNull用法代碼解讀

    java之Objects.nonNull用法代碼解讀

    這篇文章主要介紹了java之Objects.nonNull用法代碼,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • java 數據的加密與解密普遍實例代碼

    java 數據的加密與解密普遍實例代碼

    本篇文章介紹了一個關于密鑰查詢的jsp文件簡單實例代碼,需要的朋友可以參考下
    2017-04-04
  • 基于SpringBoot實現HTTP請求簽名驗證機制

    基于SpringBoot實現HTTP請求簽名驗證機制

    在分布式系統(tǒng)交互中,API接口的安全性至關重要,本文將深入解析基于Spring Boot實現的HTTP請求簽名驗證機制,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-04-04
  • Java?SE循環(huán)一些基本練習題總結

    Java?SE循環(huán)一些基本練習題總結

    循環(huán)語句可以在滿足循環(huán)條件的情況下,反復執(zhí)行某一段代碼,這段被重復執(zhí)行的代碼被稱為循環(huán)體語句,下面這篇文章主要給大家總結介紹了關于Java?SE循環(huán)一些基本練習題,需要的朋友可以參考下
    2024-03-03
  • Spring中@Transactional注解的屬性說明

    Spring中@Transactional注解的屬性說明

    這篇文章主要介紹了Spring中@Transactional注解的屬性說明,@Transactional 是聲明式事務管理 編程中使用的注解,@Transactional 注解應該只被應用到 public 方法上,這是由 Spring AOP 的本質決定的,需要的朋友可以參考下
    2023-11-11
  • Java覆蓋第三方jar包中的某一個類的實現方法

    Java覆蓋第三方jar包中的某一個類的實現方法

    在我們日常的開發(fā)中,經常需要使用第三方的 jar 包,有時候我們會發(fā)現第三方的 jar 包中的某一個類有問題,或者我們需要定制化修改其中的邏輯,那么應該如何實現呢,本文給大家介紹了Java覆蓋第三方jar包中的某一個類的實現方法,需要的朋友可以參考下
    2025-02-02
  • Java游戲開發(fā)拼圖游戲經典版

    Java游戲開發(fā)拼圖游戲經典版

    這篇文章主要介紹了Java游戲開發(fā)拼圖游戲經典版,對這方面感興趣的同學可以跟著教程試下
    2021-01-01
  • Java中文件操作功能小結

    Java中文件操作功能小結

    這篇文章主要為大家整理了一些Java中文件操作功能的相關資料,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-05-05

最新評論

临汾市| 金沙县| 都江堰市| 平武县| 山西省| 鄂托克旗| 荣昌县| 夏河县| 玛纳斯县| 苏尼特右旗| 呼图壁县| 尚志市| 台南市| 肃北| 延寿县| 新河县| 登封市| 福安市| 宁乡县| 辽阳县| 临沧市| 武川县| 泸定县| 西乌| 行唐县| 怀仁县| 育儿| 和田县| 东宁县| 无极县| 岳阳市| 丰原市| 鄂托克前旗| 沿河| 怀远县| 上虞市| 呼伦贝尔市| 秭归县| 宝兴县| 楚雄市| 措勤县|