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

Java 類與對象(十):抽象類深度解析——從概念到代碼實戰

     編輯:Java 綜合教學

什麼是抽象類?

當一個類不包含足夠信息描述具體對象時(如「水果」只有質量體積共性,無具體形態),即為抽象類。關鍵特徵:

  • abstract 修飾類
  • 可包含抽象方法(無方法體)與具體方法
  • 不能直接實例化,必須被繼承後通過子類實例化
  • 構造器用於子類 super() 鏈式初始化

代碼示例:Employee 抽象基類

public abstract class Employee {
    private String name;
    private String address;
    private int number;

    public Employee(String name, String address, int number) {
        this.name = name; this.address = address; this.number = number;
    }

    // 抽象方法:強制子類實現
    public abstract double computePay();

    // 具體方法:提供默認行為
    public void mailCheck() {
        System.out.println("Mailing check to " + name + " " + address);
    }

    // Getter/Setter...
}

錯誤示範:直接實例化抽象類

// 編譯錯誤:Cannot instantiate the type Employee
Employee e = new Employee("George", "Houston", 43);

正確用法:子類實現抽象方法

public class Salary extends Employee {
    private double salary;

    public Salary(String name, String address, int number, double salary) {
        super(name, address, number); // 必須調用父構造器
        this.salary = salary;
    }

    @Override
    public double computePay() { // 必須實現
        return salary / 52;
    }

    @Override
    public void mailCheck() { // 可選覆寫
        System.out.println("Salary mailCheck: " + getName() + " " + salary);
    }
}

// 測試
public class AbstractDemo {
    public static void main(String[] args) {
        Salary s = new Salary("Mohtashim", "Ambehta", 3, 3600);
        Employee e = new Salary("Adams", "Boston", 2, 2400); // 多態引用
        s.mailCheck();
        e.mailCheck();
    }
}

抽象類 vs 普通類 vs 接口

特性抽象類普通類接口 (Java 8+)
實例化否是否
抽象方法可有不可有可有 (默認抽象)
具體方法可有可有default/static 可有
構造器可有可有無
字段任意任意只能常量
繼承單繼承單繼承多實現

設計模式應用:模板方法模式

public abstract class DataProcessor {
    // 模板方法:定義算法骨架
    public final void process() {
        readData();
        handleData();
        writeData();
    }
    protected abstract void readData();
    protected abstract void handleData();
    protected abstract void writeData();
}

public class CsvProcessor extends DataProcessor {
    @Override protected void readData() { /* CSV 讀取 */ }
    @Override protected void handleData() { /* CSV 處理 */ }
    @Override protected void writeData() { /* CSV 寫入 */ }
}

總結

抽象類是「半成品」:封裝共性狀態與行為骨架,留出變化點給子類。核心價值在於代碼復用 + 強制契約。使用原則:有共性代碼需復用、有強制實現契約、單繼承場景 → 選抽象類。

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