標籤:
在物件導向的概念中,我們知道所有的對象都是通過類來描繪的,但是並不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的資訊來描繪一個具體的對象,這樣的類就是抽象類別。 抽象類別往往用來表徵我們在對問題領域進行分析、 設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象,我們不能把它們執行個體化(拿不出一個具體的東西)所以稱之為抽象。 比如:我們要描述“水果”,它就是一個抽象,它有品質、體積等一些共性(水果有品質),但又缺乏特性(蘋果、橘子都是水果,它們有自己的特性),我們拿不出唯一一種能代表水果的東西(因為蘋果、橘子都不能代表水果),可用抽象類別來描述它,所以抽象類別是不能夠執行個體化的。當我們用某個類來具體描述“蘋果”時,這個類就可以繼承描述“水果”的抽象類別,我們都知道“蘋果”是一種“水果”。
在物件導向領域,抽象類別主要用來進行類型隱藏。我們可以構造出一個固定的一組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類別,而這一組任意個可能的具體實現則表現為這個抽象類別的所有衍生類別。
介面和抽象類別中的所有抽象方法不能有具體實現,而應在它們的子類中實現所有的抽象方法(要有函數體,哪怕{ }裡是空的),java的設計者可能為抽象方法的靈活性考慮,每個子類可根據自己的需要來實現抽象方法。
抽象類別(abstract class)的定義方式如下:
public abstract class AbstractClass //裡面至少有一個抽象方法
{
public int t; //普通資料成員
private int i; //私人資料成員
public abstract void method1(); //抽象方法,抽象類別的子類在類中必須實現抽象類別中的抽象方法
public void method3(); //非抽象方法
public int method4();
public int method4 (){
…… //抽象類別中可以賦予非抽象方法方法的預設行為,即方法的具體實現
}
介面(interface)的定義方式如下:
public interface Interface {
static final int i=1; //介面中不能有普通資料成員,只能夠有靜態不能被修改的資料成員,static表示全域,final表示不可修改,可以不用static final 修飾,會隱式的聲明為static和final 。必須賦初始值
public void method1(); //介面中的方法一定是抽象方法,所以不用abstract修飾。不能有方法體。
}
簡言之抽象類別是一種功能不全的類,介面只是一個抽象方法聲明和靜態不能被修改的資料的集合,兩者都不能被執行個體化。 從某種意義上說,介面是一種特殊形式的抽象類別,在java語言中抽象類別表示的是一種繼承關係,一個類只能繼承繼承一個抽象類別,而一個類卻可以實現多個介面。在許多情況下,介面確實可以代替抽象類別,如果你不需要刻意表達屬性上的繼承的話。
進一步理解
1、從類的階層上看,抽象類別是在層次的頂端,但在實際的設計當中,一般來說抽象類別應當是後面才會出現。為什嗎?實際上抽象類別的擷取有點像數學中的提取公因式:ax+bx,x就是抽象類別,如果你沒有前面的式子,你怎麼知道x是不是公因式呢?在這點上,也符合人們認識世界的過程,先具體後抽象。因此在設計過程中如果你得到大量的具體概念並從當中找到其共性時,這個共性的集合就是抽象類別應當是沒錯的。
2、interface從表面上看,和抽象類別很相似,但用法完全不同。它的準系統就是把一些毫不相關的類(概念)集合在一起形成一個新的、可集中操作的“新類”。我給學生的一個典型例子就是“司機”。誰可以當司機?誰都可以,只要領取了駕照。所以我不管你是學生,白領、藍領還是老闆,只要有駕照就是司機。
interface DriverLicence {
Licence getLicence();
}
class StudentDriver extends Student implements DriverLicence { }
class WhtieCollarEmployeeDriver extends WhtieCollarEmployee implements DriverLicence { }
class BlueCollarEmployeeDriver extends BlueCollarEmployee implements DriverLicence { }
class BossDriver extends Boss implements Driver { }
當我定義了“汽車”類後,我就可以指定“司機”了。
class Car {
setDriver(DriverLicence driver);
}
這時候,Car的對象並不關心這個司機到底是幹什麼的,他們的唯一共同點是領取了駕照(都實現了DriverLicence介面)。這個,應當是介面最強大的地方也是抽象類別無法比擬的。
總結:抽象類別是提取具體類的公因式,而介面是為了將一些不相關的類“雜湊”成一個共同的群體。通常我們平時養成良好的習慣就是多用介面,畢竟java是單繼承,不像C++,但是在需要使用抽象類別的時候一定還是要用的
java抽象類別與介面 詳解