細(xì)數(shù)Java接口的概念、分類及與抽象類的區(qū)別
Java接口(Interface),是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實(shí)現(xiàn),因此這些方法可以在不同的地方被不同的類實(shí)現(xiàn),而這些實(shí)現(xiàn)可以具有不同的行為(功能)。
一、接口含義:
1.Java接口,Java語言中存在的結(jié)構(gòu),有特定的語法和結(jié)構(gòu);
2.一個類所具有的方法的特征集合,是一種邏輯上的抽象。
前者叫做“Java接口”,后者叫做“接口”。
Java接口本身沒有任何實(shí)現(xiàn),因?yàn)镴ava接口不涉及表象,而只描述public行為,所以Java接口比Java抽象類更抽象化。
Java接口的方法只能是抽象的和公開的,Java接口不能有構(gòu)造器,Java接口可以有public,靜態(tài)的和final屬性。
二、為何用接口Java是一種單繼承的語言,若要給已有父類的具體類增加新功能,在OCP原則下,解決是給它的父類加父類,或者給它父類的父類加父類,直到移動到類等級結(jié)構(gòu)的最頂端。這樣一來,對一個具體類的可插入性的設(shè)計,就變成了對整個等級結(jié)構(gòu)中所有類的修改。
當(dāng)有了接口,以上例子中,就不需要維護(hù)整個等級結(jié)構(gòu)中的所有類了.
三、接口具胡可插入性:
在一個等級結(jié)構(gòu)中的任何一個類都可以實(shí)現(xiàn)一個接口,這個接口會影響到此類的所有子類,但不會影響到此類的任何超類。此類將不得不實(shí)現(xiàn)這個接口所規(guī)定的方法,而其子類可以從此類自動繼承這些方法,當(dāng)然也可以選擇置換掉所有的這些方法,或者其中的某一些方法,這時候,這些子類具有了可插入性(并且可以用這個接口類型裝載,傳遞實(shí)現(xiàn)了他的所有子類)。
接口提供了關(guān)聯(lián)以及方法調(diào)用上的可插入性,軟件系統(tǒng)的規(guī)模越大,生命周期越長,接口使得軟件系統(tǒng)的靈活性和可擴(kuò)展性,可插入性方面得到保證。
正是有了接口,使得Java單繼承性有了新的擴(kuò)展的可能(變向地實(shí)現(xiàn)多繼承);三.類型等級結(jié)構(gòu)Java接口(以及抽象類)一般用來作為一個類型的等級結(jié)構(gòu)的起點(diǎn)。
如果一個類已經(jīng)有了一個主要的超類型,那么通過實(shí)現(xiàn)一個接口,這個類可以擁有另一個次要的超類型,這種次要的超類型叫做混合類型。
四、Java接口分類
1、普通接口(含有方法定義)public interface ActionListener{public abstract void actionPerformed(ActionEvent event);}
2、標(biāo)識接口(無任何方法和屬性定義)標(biāo)識接口是沒有任何方法和屬性的接口.標(biāo)識接口不對實(shí)現(xiàn)它的類有任何語義上的要求,它僅僅表明實(shí)現(xiàn)它的類屬于一個特定的類型。
public interface Serializable{};3、常量接口是指用Java接口來聲明一些常量,然后由實(shí)現(xiàn)這個接口的類使用這些常量。
public interface AppConstants{public static final DATA_SOURCE_NAME="test";public static final USER_NAME="test";public static final PASSWORD="test";}
五、接口的特點(diǎn)
1、Java接口中的成員變量默認(rèn)都是public,static,final類型的(都可省略),必須被顯示初始化,即接口中的成員變量為常量(大寫,單詞之間用"_"分隔)
2、Java接口中的方法默認(rèn)都是public,abstract類型的(都可省略),沒有方法體,不能被實(shí)例化
3、Java接口中只能包含public,static,final類型的成員變量和public,abstract類型的成員方法
4、接口中沒有構(gòu)造方法,不能被實(shí)例化
5、一個接口不能實(shí)現(xiàn)(implements)另一個接口,但它可以繼承多個其它的接口
6、Java接口必須通過類來實(shí)現(xiàn)它的抽象方法
7、當(dāng)類實(shí)現(xiàn)了某個Java接口時,它必須實(shí)現(xiàn)接口中的所有抽象方法,否則這個類必須聲明為抽象類
8、不允許創(chuàng)建接口的實(shí)例(實(shí)例化),但允許定義接口類型的引用變量,該引用變量引用實(shí)現(xiàn)了這個接口的類的實(shí)例
9、一個類只能繼承一個直接的父類,但可以實(shí)現(xiàn)多個接口,間接的實(shí)現(xiàn)了多繼承.
六.Java接口和Java抽象類區(qū)別面向?qū)ο笤O(shè)計的重點(diǎn)在于抽象。抽象類與接口都位于繼承樹的上層。
相同點(diǎn):
1、代表系統(tǒng)的抽象層,當(dāng)一個系統(tǒng)使用一顆繼承樹上的類時,應(yīng)該盡量把引用變量聲明為繼承樹的上層抽象類型,這樣可以提高兩個系統(tǒng)之間的送耦合2、都不能被實(shí)例化3、都包含抽象方法,這些抽象方法用于描述系統(tǒng)能提供哪些服務(wù),但不包含方法體不同點(diǎn):
1、最大的一個區(qū)別,就在于Java抽象類可以提供某些方法的部分實(shí)現(xiàn),而Java接口不可以;這大概就是Java抽象類唯一的優(yōu)點(diǎn)吧,但這個優(yōu)點(diǎn)非常有用。
可以向抽象類里加入一個新的具體方法,所有的子類都自動得到這個方法;但Java接口里加入一個 新方法,所有實(shí)現(xiàn)這個接口的類就無法成功通過編譯,必需手動給每個實(shí)現(xiàn)了該接口的類加上該方法的實(shí)現(xiàn);
2、抽象類的實(shí)現(xiàn)只能由子類給出,也即該實(shí)現(xiàn)只能在抽象類定義的繼承的等級結(jié)構(gòu)中;所以抽象類作為類型定義工具的效能大打折扣。
Java接口,任何一個實(shí)現(xiàn)了一個Java接口所規(guī)定的方法的類都可以具有這個接口的類型,而一個類可以實(shí)現(xiàn)任意多個Java接口,從而這個類就有了多種類型。
以上看出:Java接口是定義混合類型的理想工具,混合類表明一個類不僅僅具有某個主類型的行為,而且具有其他的次要行為。
3、結(jié)合1、2點(diǎn)中抽象類和Java接口的各自優(yōu)勢,具精典的設(shè)計模式就出來了:
聲明類型的工作仍然由Java接口承擔(dān),但是同時給出一個Java 抽象類,且實(shí)現(xiàn)了這個接口,而其他同屬于這個抽象類型的具體類可以選擇實(shí)現(xiàn)這個Java接口,也可以選擇繼承這個抽象類,也就是說在層次結(jié)構(gòu)中,Java 接口在最上面,然后緊跟著抽象類,這下兩個的最大優(yōu)點(diǎn)都能發(fā)揮到極至了。這個模式就是“缺省適配模式”。
在Java語言API中用了這種模式,而且全都遵循一定的命名規(guī)范:Abstract +接口名。
七.使用接口和抽象類的總體原則:
1、用接口作為系統(tǒng)與外界交互的窗口站在外界使用者(另一個系統(tǒng))的角度,接口向使用者承諾系統(tǒng)能提供哪些服務(wù),站在系統(tǒng)本身的角度,接口制定系統(tǒng)必須實(shí)現(xiàn)哪些服務(wù),接口是系統(tǒng)中最高層次的抽象類型.通過接口交互可以提高兩個系統(tǒng)之間的送耦合系統(tǒng)A通過系統(tǒng)B進(jìn)行交互,是指系統(tǒng)A訪問系統(tǒng)B時,把引用變量聲明為系統(tǒng)B中的接口類型,該引用變量引用系統(tǒng)B中接口的實(shí)現(xiàn)類的實(shí)例。
public interface B { }
public class C implements B { }
public class A { B a = new C(); }
2、Java接口本身必須非常穩(wěn)定,Java接口一旦制定,就不允許隨遇更加,否則對外面使用者及系統(tǒng)本身造成影響3、用抽象類來定制系統(tǒng)中的擴(kuò)展點(diǎn),抽象類來完成部分實(shí)現(xiàn),還要一些功能通過它的子類來實(shí)現(xiàn)
以上這篇細(xì)數(shù)Java接口的概念、分類及與抽象類的區(qū)別就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文秒懂IDEA中每天都在用的Project Structure知識
這篇文章主要介紹了一文秒懂IDEA中每天都在用的Project Structure知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10Spring?@Cacheable指定失效時間實(shí)例
這篇文章主要介紹了Spring?@Cacheable指定失效時間實(shí)例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12基于JWT的spring boot權(quán)限驗(yàn)證技術(shù)實(shí)現(xiàn)教程
這篇文章主要給大家介紹了關(guān)于基于JWT的spring boot權(quán)限驗(yàn)證技術(shù)實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11JAVA開發(fā)中的一些規(guī)范講解(阿里巴巴Java開發(fā)規(guī)范手冊)
這篇文章主要介紹了JAVA開發(fā)中的一些規(guī)范講解(阿里巴巴Java開發(fā)規(guī)范手冊),需要的朋友可以參考下2018-04-04java servlet結(jié)合mysql搭建java web開發(fā)環(huán)境
之前寫過一篇 servlet+oracle的文章,但是那是因?yàn)楣居锌赡芙幽敲匆粋€項(xiàng)目,然后我當(dāng)時也比較閑,所以隨便學(xué)了下,那玩意是白去研究了,因?yàn)楣竞竺娌]接到那項(xiàng)目。2015-12-12基于SpringBoot整合oauth2實(shí)現(xiàn)token認(rèn)證
這篇文章主要介紹了基于SpringBoot整合oauth2實(shí)現(xiàn)token 認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01