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

Java 抽象類出現的原因與作用:從代碼復用到強制契約的演進解析

     編輯:程式設計綜合問答

核心動機

抽象類解決 「部分實現共享 + 部分行為強制子類定制」 的矛盾。

演進邏輯

  1. 無繼承:代碼重復,修改同步成本高。
  2. 繼承 + 方法重寫:父類提供默認實現,子類選擇性重寫,實現代碼復用。
  3. 痛點:父類某些方法**無法給出通用默認實現**(如 `InputStream.read()`、流的具體 IO 操作),若強行提供空實現或拋異常,語義不清、易誤用。
  4. 抽象類方案:將無法實現的方法聲明為 abstract,**強制子類實現**;同時保留可復用的具體方法(模板方法模式)。

經典例子:Java IO 體系

public abstract class InputStream {
    // 子類必須實現:讀取單字節
    public abstract int read() throws IOException;

    // 模板方法:複用邏輯(讀字節數組)
    public int read(byte[] b) throws IOException { ... }
    public int read(byte[] b, int off, int len) throws IOException { ... }
    // 其他輔助方法...
}

所有流(文件、網絡、內存、壓縮)繼承 `InputStream`,只需實現 `read()`,其餘批量讀取邏輯自動復用。

抽象類 vs 接口

特性抽象類接口
構造器有(子類調用 super())無
字段狀態可有實例字段僅常量
方法實現可混合抽象/具體默認方法/靜態方法
繼承關係單繼承多實現
適用場景「是一種」強關聯、共享狀態/邏輯「能做什麼」能力定義、多態解耦

總結

抽象類是**不完整的類**,封裝「不變的骨架」,留出「變化的洞」(抽象方法),引導子類填補,實現**受控的擴展**。

  1. 上一篇文章:
  2. 下一篇文章: