Java 的抽象特性:抽象类与接口深度解析
要點(diǎn):
抽象類
接口
抽象類與接口的差別
一. 抽象
對(duì)于面向?qū)ο缶幊虂碚f,抽象是它的四大特征之中的一個(gè)。
在Java中,能夠通過兩種形式來體現(xiàn)OOP的抽象:接口和抽象類。
接口和抽象類為我們提供了一種將接口與實(shí)現(xiàn)分離的更加結(jié)構(gòu)化的方法。
二. 抽象類
1).概念基礎(chǔ)
我們都知道在面向?qū)ο蟮念I(lǐng)域一切都是對(duì)象。
同一時(shí)候,全部的對(duì)象都是通過類來描寫敘述的,可是并非全部的類都是能夠描寫敘述對(duì)象(對(duì)象 = 狀態(tài) + 行為)的。假設(shè)一個(gè)類沒有足夠的信息來描寫敘述一個(gè)詳細(xì)的對(duì)象,那么我們就能夠?qū)⑦@種類設(shè)為抽象類。抽象類僅僅能被public和默認(rèn)修飾符修飾。
在了解抽象類之前。先來了解一下 抽象方法。抽象方法是一種特殊的方法:它僅僅有聲明。而沒有詳細(xì)的實(shí)現(xiàn)。
抽象方法的聲明格式為:
abstract void func();抽象方法必須用abstract關(guān)鍵字進(jìn)行修飾。假設(shè)一個(gè)類含有抽象方法,則稱這個(gè)類為抽象類,抽象類必須在類前用abstract關(guān)鍵字修飾 (特別須要注意的是,抽象類也能夠不包括抽象方法,即當(dāng)中全部的方法都是詳細(xì)方法)。由于抽象類中含有未詳細(xì)實(shí)現(xiàn)的方法。所以不能用抽象類創(chuàng)建對(duì)象。
public abstract class ClassName {abstract void fun(); }從這里能夠看出。抽象類就是為了繼承而存在的,假設(shè)你定義了一個(gè)抽象類,卻不去繼承它,那么等于白白創(chuàng)建了這個(gè)抽象類。由于你不能用它來做不論什么事情。
對(duì)于一個(gè)父類,假設(shè)它的某個(gè)方法在父類中實(shí)現(xiàn)出來沒有不論什么意義。必須依據(jù)子類的實(shí)際需求來進(jìn)行不同的實(shí)現(xiàn),那么就能夠?qū)⑦@種方法聲明為abstract方法。此時(shí)這個(gè)類也就成為abstract類了。
包括抽象方法的類稱為抽象類。但并不意味著抽象類中僅僅能有抽象方法,它和普通類一樣,相同能夠擁有成員變量和普通的成員方法。注意,抽象類和普通類的主要有三點(diǎn)差別:
抽象方法不能是 private的,否則。其不能被子類繼承,子類也無法實(shí)現(xiàn)該方法。從而這樣做沒有不論什么意義;
抽象類不能用來創(chuàng)建對(duì)象;
假設(shè)一個(gè)類繼承于一個(gè)抽象類,則子類必須實(shí)現(xiàn)父類的抽象方法。假設(shè)子類沒有實(shí)現(xiàn)父類的抽象方法,則必須將子類也定義為為abstract類。
在其它方面。抽象類和普通的類并沒有差別。
2).本質(zhì)
抽象類與詳細(xì)類的唯一差別:含有抽象方法的類一定是抽象類;
抽象類的根本作用是為了繼承。所以抽象類的抽象方法不能被private修飾;
抽象類比詳細(xì)類僅多一點(diǎn)抽象因素:行為層面的抽象(能夠包括抽象方法)。
三. 接口
1).概念基礎(chǔ)
接口(interface),在軟件project中。接口泛指供別人調(diào)用的方法或者函數(shù)。從這里。我們能夠體會(huì)到Java語言設(shè)計(jì)者的初衷,它是對(duì)行為的抽象。接口僅僅能被public和默認(rèn)修飾符修飾。 在Java中。定義一個(gè)接口的形式例如以下:
public interface InterfaceName {}接口中能夠含有 變量和方法。
可是要注意,接口中的 變量 會(huì)被隱式地指定為 public static final變量(而且僅僅能是public static final變量,而且 public static final 可省。即默認(rèn)就是public static final 的) 。而 方法 會(huì)被隱式地指定為 public abstract方法且僅僅能是 public abstract 方法(public abstract 可省,即默認(rèn)就是 public abstract 的),而且接口中全部的方法不能有詳細(xì)的實(shí)現(xiàn)。也就是說,接口中的方法必須都是抽象方法。
從這里能夠隱約看出接口和抽象類的差別。接口是一種極度抽象的類型,它比抽象類更加“抽象”。
要讓一個(gè)類遵循某組特地的接口須要使用 implements 關(guān)鍵字,詳細(xì)格式例如以下:
class ClassName implements Interface1,Interface2,[....]{}能夠看出,同意一個(gè)類遵循多個(gè)特定的接口。假設(shè)一個(gè)非抽象類遵循了某個(gè)接口。就必須實(shí)現(xiàn)該接口中的全部方法。對(duì)于遵循某個(gè)接口的抽象類,能夠不實(shí)現(xiàn)該接口中的抽象方法。
2).本質(zhì)
- 接口是一種行為契約。是對(duì)行為的抽象。
四. 接口與抽象類的差別
1.語法層面上的差別
1)抽象類能夠提供成員方法的實(shí)現(xiàn)細(xì)節(jié)。而接口中僅僅能存在 public abstract (可省) 方法;
2)抽象類中的成員變量能夠是各種類型的,而接口中的成員變量僅僅能是 public static final (可省) 類型的;
3)接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法,而抽象類能夠有靜態(tài)代碼塊和靜態(tài)方法;
4)一個(gè)類僅僅能繼承一個(gè)抽象類,而一個(gè)類卻能夠?qū)崿F(xiàn)多個(gè)接口。
2.設(shè)計(jì)層面上的差別
1)抽象類是對(duì)一種事物的抽象,即對(duì)類抽象,而接口是對(duì)行為的抽象。
抽象類是對(duì)整個(gè)類總體進(jìn)行抽象。包括屬性、行為,可是接口卻是對(duì)類局部(行為)進(jìn)行抽象。
舉個(gè)簡單的樣例,飛機(jī)和鳥是不同類的事物。可是它們都有一個(gè)共性,就是都會(huì)飛。那么在設(shè)計(jì)的時(shí)候,能夠?qū)w機(jī)設(shè)計(jì)為一個(gè)類 Airplane。將鳥設(shè)計(jì)為一個(gè)類 Bird,可是不能將飛行 這個(gè)特性也設(shè)計(jì)為類,因此它僅僅是一個(gè)行為特性,并非對(duì)一類事物的抽象描寫敘述。此時(shí)能夠?qū)?飛行 設(shè)計(jì)為一個(gè)接口Fly。包括方法fly(),然后Airplane和Bird分別依據(jù)自己的須要實(shí)現(xiàn)Fly這個(gè)接口。然后至于有不同種類的飛機(jī)。比方戰(zhàn)斗機(jī)、民用飛機(jī)等直接繼承Airplane就可以。對(duì)于鳥也是相似的,不同種類的鳥直接繼承Bird類就可以。從這里能夠看出,繼承是一個(gè) “是不是”的關(guān)系,而 接口 實(shí)現(xiàn)則是 “有沒有”的關(guān)系。
假設(shè)一個(gè)類繼承了某個(gè)抽象類,則子類必然是抽象類的種類,而接口實(shí)現(xiàn)則是有沒有、具備不具備的關(guān)系,比方鳥能否飛(或者是否具備飛行這個(gè)特點(diǎn)),能飛行則能夠?qū)崿F(xiàn)這個(gè)接口。不能飛行就不實(shí)現(xiàn)這個(gè)接口。
2)設(shè)計(jì)層面不同。抽象類作為非常多子類的父類。它是一種模板式設(shè)計(jì)。
而接口是一種行為規(guī)范(契約),它能夠跨越不同的類。是一種輻射式設(shè)計(jì)。
什么是模板式設(shè)計(jì)?最簡單樣例,大家都用過ppt里面的模板,假設(shè)用模板A設(shè)計(jì)了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了。假設(shè)它們的公共部分須要修改。則僅僅須要修改模板A就能夠了,不須要又一次對(duì)ppt B和ppt C進(jìn)行修改。而輻射式設(shè)計(jì),比方某個(gè)電梯都裝了某種報(bào)警器,一旦要更新報(bào)警器,就必須全部更新。
也就是說 對(duì)于抽象類。假設(shè)須要加入新的方法,能夠直接在抽象類中加入詳細(xì)的實(shí)現(xiàn),子類能夠不進(jìn)行變更。而對(duì)于接口則不行。假設(shè)接口進(jìn)行了變更,則全部實(shí)現(xiàn)這個(gè)接口的類都必須進(jìn)行對(duì)應(yīng)的修改。
以下看一個(gè)網(wǎng)上流傳最廣泛的樣例:門和警報(bào)的樣例:門都有open( )和close( )兩個(gè)動(dòng)作,此時(shí)我們能夠定義通過抽象類和接口來定義這個(gè)抽象概念:
abstract class Door {public abstract void open();public abstract void close(); }或者
interface Door {public abstract void open();public abstract void close(); }可是如今假設(shè)我們須要門具有報(bào)警alarm( )的功能,那么該怎樣實(shí)現(xiàn)?以下提供兩種思路:
1)將這三個(gè)功能都放在抽象類里面。可是這樣一來全部繼承于這個(gè)抽象類的子類都具備了報(bào)警功能。可是有的門并不一定具備報(bào)警功能;
2)將這三個(gè)功能都放在接口里面,須要用到報(bào)警功能的類就須要實(shí)現(xiàn)這個(gè)接口中的open( )和close( )。或許這個(gè)類根本就不具備open( )和close( )這兩個(gè)功能。比方火災(zāi)報(bào)警器。
從這里能夠看出。 Door的open() 、close()和alarm()根本就屬于兩個(gè)不同范疇內(nèi)的行為。open()和close()屬于門本身固有的行為特性。而alarm()屬于延伸的附加行為。因此最好的解決的方法是單獨(dú)將報(bào)警設(shè)計(jì)為一個(gè)接口,包括alarm()行為,Door設(shè)計(jì)為單獨(dú)的一個(gè)抽象類,包括open和close兩種行為。再設(shè)計(jì)一個(gè)報(bào)警門繼承Door類和實(shí)現(xiàn)Alarm接口。
interface Alram {void alarm(); }abstract class Door {void open();void close(); }class AlarmDoor extends Door implements Alarm {void oepn() {//....}void close() {//....}void alarm() {//....} }3、小結(jié)
抽象類是對(duì)一種事物的抽象,接口是對(duì)行為的抽象;
抽象類是一種模板,接口是一種契約;
抽象類的抽象程度介于普通類和接口之間。
引用
《Java 編程思想》
深入理解Java的接口和抽象類
java提高篇(四)—–抽象類與接口
Java抽象類與接口的差別
轉(zhuǎn)載于:https://www.cnblogs.com/gavanwanggw/p/7325372.html
總結(jié)
以上是生活随笔為你收集整理的Java 的抽象特性:抽象类与接口深度解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为P50官方翻新机开售 5000万像素
- 下一篇: 学习娱乐两不误!华为FreeBuds系列