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