首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

計算機程序思維邏輯 (20):抽象類與接口的協作藝術

     編輯:Java 綜合教學

計算機程序的思維邏輯 (20) —— 抽象類

基本概念

具體類對應具體對象;抽象類 表達抽象概念,是具體類的上層父類,不能實例化。例如:狗是具體對象,動物是抽象概念;正方形是具體,圖形是抽象。

抽象方法與抽象類

抽象方法只有聲明無實現,用 abstract 修飾。包含抽象方法的類必須聲明為抽象類。抽象類可包含具體方法、實例變量。

public abstract class Shape {
    public abstract void draw(); // 抽象方法
    public void move() { ... }   // 具體方法
}

子類繼承抽象類必須實現所有抽象方法,否則子類也得聲明 abstract。雖不能 new Shape(),但可聲明抽象類類型變量引用具體子類對象:

Shape shape = new Circle(); // Circle 實現了 draw()
shape.draw(); // 動態調用 Circle.draw()

為什麼需要抽象類?

不是語法必需,而是工程防禦機制:

  • 抽象方法強制子類實現,避免遺漏(空方法體易被忽略)。
  • 抽象類禁止實例化,引導使用者選擇具體子類,防止誤用不完整的父類。

好工具讓普通人也難犯錯,這是語言設計的智慧。

抽象類與接口的協作

接口定義能力(What),抽象類提供默認實現(How)。一個類可實現多接口,但只能單繼承。常見模式:

  • Collection 接口 + AbstractCollection 抽象類
  • List + AbstractList
  • Map + AbstractMap

實現接口有兩條路:

  1. 直接 implements 接口,全量實現。
  2. extends 抽象類,選擇性重寫(復用代碼,工作量少)。

若類已有父類,只能選擇路徑 1。

實戰示例:加法器

// 接口定義能力
public interface IAdd {
    void add(int number);
    void addAll(int[] numbers);
}

// 抽象類提供默認實現
public abstract class AbstractAdder implements IAdd {
    @Override public void addAll(int[] numbers) {
        for (int n : numbers) add(n); // 依賴抽象方法 add()
    }
}

// 具體類繼承抽象類,僅實現核心邏輯
public class Base extends AbstractAdder {
    private static final int MAX = 1000;
    private int[] arr = new int[MAX];
    private int count;
    @Override public void add(int number) {
        if (count < MAX) arr[count++] = number;
    }
}

小結

抽象類表達不完整概念,配合接口實現「能力定義 + 骨架實現」分離,減少誤用、提升復用。下一節將探討內部類:為什麼要把類放在另一個類裡?

關注微信公眾號「老馬說編程」獲取最新連載。

公眾號二維碼

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved