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

Java 抽象類與接口深度對比:核心差異、應用場景與設計原則

     編輯:Java 綜合教學

前言

面向對象設計的關鍵在於抽象——建立「問題空間」到「方案空間」的理想映射。抽象類和接口是抽象過程的核心產物。

一、抽象類

定義與特征

若類中不包含足夠信息描述具體對象,即為抽象類。它對一類特征相同但細節不同的對象進行抽象。

public abstract class Bird {
    private String color;
    
    public String getColor() { return color; }
    public void setColor(String color) { this.color = color; }
    public Bird() {}
    
    // 抽象方法:無方法體,強制子類實現
    public abstract void sing();
}

// 具體子類
class Magpie extends Bird {
    @Override
    public void sing() {
        System.out.println("I can sing in a whisper.");
    }
}

抽象類七大特征

  1. abstract 關鍵字修飾類
  2. 抽象方法用 abstract 修飾,無方法體
  3. 可包含非抽象方法(普通方法)
  4. 可無抽象方法(但無設計意義),含抽象方法的類必須是抽象類
  5. 單繼承(本質是類)
  6. 不能實例化(不能 new),不描述具體對象
  7. 可有實例變量和構造方法

二、接口

定義與角色

接口是方法特征的集合,是契約,規定「能做什麼」。設計中要依賴抽象,而非具體實現。

如 USB 接口:無論硬盤、U盤、手機,實現 USB 規範即可連接電腦。

接口示例

public interface IFly {
    void fly(); // 默認 public abstract
}

// 鵲鳥實現飛行
class Magpie extends Bird implements IFly {
    @Override
    public void sing() {
        System.out.println("I can sing in a whisper.");
    }
    
    @Override
    public void fly() {
        System.out.println("我會飛了!");
    }
}

若需增加游泳功能,同理定义 ISwim 接口,避免污染鳥類體系。

接口七大特征

  1. 修飾符:public、abstract、default(隱式)
  2. 關鍵字:interface
  3. 所有方法默認 public abstract(Java 8 前),實現類必須 public 實現
  4. 所有方法必須在實現類中實現(抽象類除外)
  5. 變量默認 public static final(常量)
  6. 一個類可實現多個接口(突破單繼承限制)
  7. Java 8+ 支持 default、static、private 方法

三、核心差異對比

維度抽象類接口
關系類型is-a(繼承關系)like-a(行為契約)
繼承/實現單繼承 extends多實現 implements
方法實現可有默認實現Java 8 前全抽象,8+ 可 default
構造方法可有不可有
成員變量任意僅常量 static final
訪問修飾符任意方法默認 public

四、應用場景指南

1. 使用抽象類:共享代碼、is-a 關系

  • 多個子類有共同實現邏輯,提取到抽象類避免重複
  • 子類本質屬於同一類別(如:貓、狗都是動物)
  • 需要非 public 的方法/字段

2. 使用接口:行為契約、like-a 關系、多實現

  • 不同類別對象擁有相同行為(飛機和鳥都會飛)
  • 需實現多個不相關接口(如:Serializable、Cloneable、Comparable)
  • 定義類型規範,實現由提供者決定

3. 面向接口編程:封裝變化、解耦

// 客戶端不依賴具體實現
UserService userService = container.getBean(UserService.class); // IoC 注入
userService.register(user);

// 系統間交互:雙方約定接口,不關心內部實現
public interface PaymentService {
    boolean pay(Order order);
}
// 支付寶、微信支付各自實現,業務代碼零修改切換


體現的設計原則:

  • 開閉原則(對擴展開放,對修改關閉)
  • 接口隔離原則(細粒度接口)
  • 依賴倒置原則(依賴抽象不依賴具體)
  • 適配器模式、策略模式等核心思想

五、決策流程圖

需要定義類型契約?
    ├─ 是 → 接口
    └─ 否 → 需要共享代碼/狀態?
              ├─ 是 → 抽象類
              └─ 否 → 具體類

關注「老姜談技術」,微信號:helojava,每日一帖技術雞湯。

公眾號二維碼

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