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

Java 抽象類詳解(一):核心概念、語法規則、兩大用途與設計判斷

     編輯:Java 相關知識

抽象類核心定義

abstract class:使用 abstract 修飾的類,**不能直接實例化**(new Abstract() 編譯錯誤),但可聲明引用變量。作為繼承體系的「半成品」,規範子類結構,提供共享實現。

abstract method:無方法體(無 {}),以分號結尾,強制子類覆寫(除非子類也 abstract)。

語法規則速覽

規則說明
修飾符public/protected/default,不可 private(子類不可見)
抽象方法所在類必須為 abstract class 或 interface
子類義務覆寫所有抽象方法,或繼續聲明 abstract
構造器有,供子類 super(...) 調用,不可 new 直接調用
字段/普通方法可有任意(含 private、static、final)
可聲明引用AbstractType ref; ✓,new AbstractType() ✗

兩大核心用途

1. 禁止直接實例化(工具類/單例骨架)

// 工具類:所有方法 static,防誤 new
public abstract class MathUtils {
    private MathUtils() {}  // 或無構造器(隱式 protected)
    public static int max(int a, int b) { return a > b ? a : b; }
}

// 配合 final 徹底封死繼承
public abstract final class Constants {  // 編譯錯誤:abstract 和 final 互斥
// 正確做法:
public final class Constants {
    private Constants() {}
    public static final String APP_NAME = "MyApp";
}

注意:abstract 和 final 互斥。防實例化用 private 構造器 或 final class + private 構造器。

2. 強制子類覆寫統一方法簽名(模板方法/多態基石)

場景:遊戲怪物體系,每種怪物移動規則不同,但調用者統一呼叫 move()。

public abstract class Monster {
    protected int x, y;  // 共享座標狀態
    
    // 模板方法:定義移動流程骨架
    public final void move() {
        beforeMove();
        doMove();           // 抽象點:子類實現具體規則
        afterMove();
    }
    
    protected void beforeMove() { System.out.println("Start moving"); }
    protected void afterMove() { System.out.println("End at " + x + "," + y); }
    
    // 強制子類實現
    protected abstract void doMove();
}

// 具體怪物
public class FlyingMonster extends Monster {
    @Override protected void doMove() { y += 10; }  // 飛行:Y 軸增加
}

public class WalkingMonster extends Monster {
    @Override protected void doMove() { x += 5; }   // 行走:X 軸增加
}

// 統一調用
List monsters = Arrays.asList(new FlyingMonster(), new WalkingMonster());
monsters.forEach(Monster::move);  // 多態分發

何時設計抽象類?判斷清單

滿足以下任一 → 考慮抽象類:

  1. 子類不繼承其他類(單繼承名額可用)。
  2. 存在完全相同的方法實現(可上拉到父類共享)。
  3. 存在相同字段/狀態(如 ID、創建時間、公共配置)。
  4. 需要構造器強制初始化參數(如數據源、線程池、配置對象)。
  5. 需要非 public 共享輔助方法(protected 模板鉤子、private 內部邏輯)。

自上而下 vs 自下而上設計

  • 自上而下:先設計抽象父類定義骨架,再派生子類。適合領域模型清晰、框架開發。
  • 自下而上:先寫具體類,重構提取公共部分形成抽象類。適合初學者、遺留代碼重構。

抽象類 vs 介面(JDK 7 視角)

維度抽象類介面 (JDK 7)
繼承/實現單繼承 extends多實現 implements
方法類型抽象 + 具體僅抽象
字段實例/靜態/常量僅常量 (public static final)
構造器有無
訪問控制全套隱式 public

特殊用途

  • 禁止實例化 + 禁止繼承:final class + private 構造器(工具類標準寫法)。
  • 常量庫:不推薦 用介面(實現類命名空間污染),用 final class Constants { private Constants(){} }。
  • 統一類型標記:Serializable、Cloneable 等標記介面(無方法,反射檢測)。

設計原則提醒

「不濫用繼承」—— 優先組合(has-a),符合 is-a 且需共享實現時才用繼承。
抽象類是強耦合關係(繼承 = 白盒復用),介面是弱耦合(實現 = 黑盒契約)。

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