前言
前面兩篇我們分別說了面向對象四大基本特性:繼承和多態,這一篇文章主要來說一下在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("玩耍");
}
}
如果不是如上的寫法就會爆如下的錯誤.
同時我們也可以通過繼承來實現接口的擴展.這一點很具體類是一致的.示例如下所示.
interface ChildrenAction extends PeopleAction{
void cry();
}
本文所有內容詳情可查看Think in Java(Java編程思想)第九章的接口部分,所以還是建議大家去看原書.本文只是作為學習筆記,如有紕漏,歡迎指出.