1. 程式人生 > >java|抽象類和介面及抽象類的常用專案經驗

java|抽象類和介面及抽象類的常用專案經驗

一、抽象類

1. 抽象類的設計思想

如果自下而上在類的繼承層次結構中上移,位於上層的類更具有通用性,甚至可能更加抽象。從某種角度看,祖先類更加通用,人們只將它作為派生其他類的基類,而不作為想使用的特定的例項類。

2. 抽象類的定義及其成員

由於抽象類更加具有通用性,可以在抽象類的方法中體現,即抽象方法。例如學生類Students和老師類Teachers都繼承Person類,他們都有一個getDescription方法,返回對一個人的簡單描述。這個方法便可以體現抽象類的通用性,使用關鍵字abstract定義該方法,使其不用在Person類實現這個方法,在子類實現具體方法。
所以抽象類的定義是包含一個或多個抽象方法的類。其實,在《java核心技術卷1》中說明即使沒有抽象方法,也可以將類宣告為抽象類,個人覺得這也沒什麼意義了,可以忽略這個問題。
抽象類的成員:抽象類除了定義的抽象方法,還可以包含具體資料和具體的方法(即非抽象方法)。抽象方法必須是public、protected修飾符,預設是public,不用private修飾符是方法需要給子類訪問

。即:

public abstract String getDescription();
protected abstract String getDescription();

抽象方法是沒有方法體的,即使是空的。在編譯器中是會報Abstract methods do not specify a body的錯誤。

3. 兩種繼承抽象類的子類

首先記住繼承抽象類的子類都必須定義抽象類的方法(這也是抽象類存在的原因,你不繼承,那要我何用)
第一種,子類定義部分抽象類方法或不定義抽象類的方法,這樣的子類也標記為抽象類。
第二種,子類定義所有抽象類的方法,子類不再是抽象類。

4.物件變數

抽象類不能例項化,所以引入新的概念,物件變數。
例如,

Person p = new Students("小明");//p即是物件變數

抽象類Person只能定義物件變數不能構造物件,所以它只能引用非抽象類子類的物件,也是正因為這個,該變數引用的方法都是子類實現的方法。

5.抽象類的常用專案經驗

如果你想要實現介面的某些方法,先寫一個抽象類實現你所要實現的方法之外的所有方法,然後寫一個類繼承這個抽象類。比如你需要實現滑鼠監聽器中某個方法,你首先會想到建立一個類繼承MouseAdapter,這樣就解決問題了。實際上,MouseAdapter就是實現了MouseListener介面。上例子程式碼:

//案例內容:某公司HR打算在大學中挑選人員進行培訓,定製的相應課程,已經在大學學習過的課程不培訓。

//公司挑選人員培訓的課程
public interface ICompanyHR {
    void baseJava();

    void projectJava();

    void baseDB();

    void advancedDB();
}

//大學已經培訓過的課程是baseJAVA和baseDB
public abstract class ACollege implements ICompanyHR {

    @Override
    public void baseJava() {
        System.out.println("baseJAVA learning in college");
    }

    @Override
    public void baseDB() {
        System.out.println("baseDB learning in college");
    }
}

//挑選的人員是在大學中學習過基礎java和基礎db的人員,培訓週期相對縮短
public class Trainer extends ACollege{
    @Override
    public void projectJava() {
        // TODO Auto-generated method stub

    }
    @Override
    public void advancedDB() {
        // TODO Auto-generated method stub  
    }
}

二、介面

1. 介面的設計思想

我們經常聽到服務提供商這樣說:“如果類遵從某個特定介面,那麼就履行這項服務”。

另一種想法,是我的一個老師的理解,介面相當於制定一套標準。比如企業釋出的招聘資訊就算是一種標準。應聘者需要符合這個標準(定義介面的方法)才能應聘,這也是一個很好的案例。

2. 介面的定義

介面是沒有例項域的抽象類。(例項域:物件的屬性方法等)在介面中只能定義靜態變數和抽象的方法。例如:

//interface理解為標準
public interface ICompanyHR {
    //interface標準中只能定義常量,並且關鍵字必須是public static final
    //介面中的常量可以理解招聘資訊中工資固定不變
    public static final double MINSAL = 8000;
    //interface標準中定義許多行為條件(關鍵字必須是 public abstract)
    public abstract void useJava();
    public abstract void useOracle();
    public abstract void useMysql();    
}

定義變數和方法的關鍵字可以不寫,預設是以上程式碼中的關鍵字。

3. 介面和抽象類

由於java單繼承的特性,所以引入了介面的概念。