国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Java中的abstract和interface

Java中的abstract和interface

2022-03-10 13:33李子捌 Java教程

abstract和interface關(guān)鍵字在Java中隨處可見,它是Java三大特性封裝、繼承、多態(tài)特性的實(shí)現(xiàn)重要支柱之一。interface關(guān)鍵字用于定義接口抽象,其本質(zhì)上是用于定義類型、定義類所具有的能力,下面來(lái)看看詳細(xì)內(nèi)容,需要的朋友可以參考一

Java中的abstract和interface

1、簡(jiǎn)介

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

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

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

2、準(zhǔn)則

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

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

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

HashMap繼承體系類圖結(jié)構(gòu):

Java中的abstract和interface

HashMap的頂層接口:

public interface Map<K,V>{}

HashMap實(shí)現(xiàn)的抽象類:

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

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

抽象類abstract的特點(diǎn):

  • 抽象方法和抽象類都必須被abstract關(guān)鍵字修飾
  • 一個(gè)類中有抽象方法,那么這個(gè)類一定是抽象類
  • 抽象類中不一定有抽象方法
  • 抽象類中可以存在構(gòu)造方法
  • 抽象類中可以存在普通屬性、方法、靜態(tài)屬性和靜態(tài)方法
  • 抽象類的方法必須在子類中實(shí)現(xiàn),否則子類也需要定義為抽象類
  • 抽象類不可以用new創(chuàng)建對(duì)象,因?yàn)檎{(diào)用抽象方法沒有實(shí)現(xiàn)就沒有意義

接口interface的特點(diǎn):

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

 

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

 

總結(jié):

  • 在整個(gè)抽象實(shí)現(xiàn)體系中,必須提供一些方法的默認(rèn)實(shí)現(xiàn),可以使用抽象類(因?yàn)榉浅2唤ㄗh在接口中直接實(shí)現(xiàn)某些方法)
  • 如果不需要提供默認(rèn)實(shí)現(xiàn),且需要實(shí)現(xiàn)多繼承的功能就使用接口

2.2 接口中不應(yīng)該實(shí)現(xiàn)方法

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

2.3 接口不應(yīng)該用于導(dǎo)出常量

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * <p>
 *      緩存key
 * </p>
 *
 * @Author: Liziba
 * @Date: 2021/11/2 23:12
 */
public interface CacheKey {
 
    String USER = "user";
 
    String ORDER = "order";
 
    String MAIL = "mail";
 
}

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

比如如下這種方法:

?
1
2
3
4
5
6
7
8
9
public class CacheKey {
 
    public static final String USER = "user";
 
    public static final String ORDER = "order";
 
    public static final String MAIL = "mail";
 
}

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

到此這篇關(guān)于Java中的abstractinterface的文章就介紹到這了,更多相關(guān)Java中的abstractinterface內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://juejin.cn/post/7026136826490388516

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 九九热在线视频 | 黄色免费观看网址 | 亚洲精品一区中文字幕乱码 | 欧美 日韩 国产 成人 在线 91 | 黄视频在线免费看 | 欧美一区免费 | 日韩在线视频观看免费 | 国产 欧美 日韩 一区 | 国久久久 | 国产欧美日韩综合精品一区二区 | 久久国产精品免费一区二区三区 | 在线国产一区二区 | 91av在线视频观看 | 成人午夜视频网 | 婷婷精品 | 香蕉视频在线看 | 中国久久久 | 97成人在线免费视频 | 一区二区av | 国产a在亚洲线播放 | 中文字幕一二三 | 精品一区二区电影 | 日韩爱爱网址 | 日韩一区二区在线播放 | 中文字字幕一区二区三区四区五区 | 国产黄色av网站 | 欧美a级片在线观看 | 久久久久久成人 | 国产一区二区三区在线免费观看 | 伊人网在线视频免费观看 | 在线日韩视频 | 国偷自产一区二区免费视频 | 免费观看一级视频 | 日韩精品在线观看视频 | 亚洲日本视频 | 日本久久久 | 久久成人国产 | 国产黄色影视 | 91精品久久久久久久久久 | 国产激情在线 | 久久午夜影院 |