1. 程式人生 > >Java(7):面向物件四大基本特性:抽象

Java(7):面向物件四大基本特性:抽象

1396375-14282f0443f99d6a.png
前言

前面兩篇我們分別說了面向物件四大基本特性:繼承和多型,這一篇文章主要來說一下在Java中三大基本特性中的抽象是如何體現的.在Think in Java(Java程式設計思想)這本書中的第九章的介面章節中是對抽象這個概念的一個很好的體現.

抽象類和抽象方法

在Java中,我們經常有這樣的需求,在基類中不需要對某個方法進行實現,只要宣告這個方法的存在即可.我們在沒有搞抽象類之前我們會怎麼辦呢?我們會在基類中寫一個方法,但是具體內部實現是沒有的,然後子類繼承基類之後,重寫了基類中的這個方法.如下所示.

    protected  void printName(String name) { }

假定我們只有一個抽象基類,也就說基類中的各種方法沒有任何意義,所以當我們建立一個基類物件的時候是沒有任何意義的,並且我們可能還想阻止使用者這麼做.通過讓基類中的所有方法都產生錯誤,就可以實現這個目的,但是這樣做會將錯誤資訊延時到執行時才獲得.並且需要在客戶端進行可靠、詳細的測試.所以最好是在編譯時補貨這些問題.

為此,Java提供了一個叫做抽象方法的機制,這種方法是不完整的,只有宣告而沒有方法體.我們需要使用關鍵字abstract來修飾.示例如下所示.

    abstract protected  void printName(String name);

當然了,如果一個抽象類中有抽象方法的存在,那麼我們必須使用abstract

來修飾這個類.並且,如果子類繼承於這個抽象基類,並想建立該子類的物件,那麼就必須為基類中的所有抽象方法提供方法定義.如果不這樣做編譯器將會強制我們使用abstract關鍵字來限定這個子類.下面我們就看一個完整的抽象類示例.

public abstract class People {
    
    abstract void printAge(int age);
}

class Children extends People {
    
    public void printAge(int age) {
        
        System.out.println("年齡:"+age);
    }
}

介面

上一個模組,我們說到了抽象類的關鍵字abstract,我們通過抽象類可以實現方法的實現.這個模組主要說的是介面類,在抽象類中我們可以允許有已經實現部分的方法和非實現部分的類,但是在介面類是一個完全抽象的類,他根本沒有任何具體實現.它允許建立者確定方法名、引數列表和返回型別,但是沒有任何方法體.介面只提供形式,而未提供任何具體表現.介面類的關鍵字是interface.舉例如下所示.

interface PeopleAction{
    
    int age = 10;
    
    void run();
    void eat();
    void play();
}

那麼,當我們想要某個類來遵循某個介面,那麼我們就需要用到關鍵字implements.同時要注意的是當要實現一個介面時,在介面中被定義的方法必須是被定義為是public.示例如下所示.

class People implements PeopleAction
{

    public void run() {
        System.out.println("跑步");
    }
    public void eat() {     
        System.out.println("吃飯");
    }
    public void play() {
        System.out.println("玩耍");
    }
}

當我們的類組合了具體的父類以及具體的介面類的時候,當通過這種方式將一個具體類和多個介面組合到一起的時候,這個具體類必須放在前面,後面跟著才是介面,否則編譯器會報錯.

class Children extends People  implements PeopleAction
{
    public void printAge(int age) {
        
        System.out.println("年齡:"+age);
    }
    
    public void run() {
        System.out.println("跑步");
    }
    public void eat() {     
        System.out.println("吃飯");
    }
    public void play() {
        System.out.println("玩耍");
    }

}

如果不是如上的寫法就會爆如下的錯誤.

1396375-a3a339d83f58bede.png

同時我們也可以通過繼承來實現介面的擴充套件.這一點很具體類是一致的.示例如下所示.

interface ChildrenAction extends PeopleAction{
    
    void cry();
}

本文所有內容詳情可檢視Think in Java(Java程式設計思想)第九章的介面部分,所以還是建議大家去看原書.本文只是作為學習筆記,如有紕漏,歡迎指出.

1396375-039b9d91827a61c8.gif