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

Java 抽象類不能實例化,為什麼還能有構造器?

     編輯:程式設計綜合問答

疑問:構造器是為初始化對象服務的,抽象類不能 new,為什麼允許定義構造器?

答案:給子類調用的,實現「模板方法」與公共初始化

  • 抽象類構造器**不能被外部直接調用**,但**會在子類實例化時隱式/顯式調用**
  • 子類構造器第一行默認 super(),會調用父類無參構造器;或顯式 super(args) 調用帶參構造器
  • 作用:初始化繼承自父類的字段、執行公共邏輯、強制子類提供必要參數

代碼示例

abstract class Animal {
    protected String name;
    protected int age;
    
    // 強制子類提供名字
    public Animal(String name) {
        this.name = name;
        System.out.println("Animal 初始化: " + name);
    }
    
    public abstract void sound();
}

class Dog extends Animal {
    private String breed;
    
    public Dog(String name, String breed) {
        super(name); // 必須調用父類構造器
        this.breed = breed;
        System.out.println("Dog 初始化: " + breed);
    }
    
    @Override public void sound() { System.out.println("Wang!"); }
}

public class Test {
    public static void main(String[] args) {
        new Dog("Buddy", "Golden"); 
        // 輸出:
        // Animal 初始化: Buddy
        // Dog 初始化: Golden
    }
}

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

abstract class DataProcessor {
    private Connection conn;
    
    public DataProcessor(DataSource ds) throws SQLException {
        this.conn = ds.getConnection(); // 公共資源初始化
    }
    
    // 模板方法
    public final void process() {
        try {
            readData();
            transform();
            writeData();
        } finally {
            close();
        }
    }
    
    protected abstract void readData();
    protected abstract void transform();
    protected abstract void writeData();
    
    private void close() { /* 關閉連接 */ }
}

關鍵規則

  • 抽象類構造器通常聲明為 protected(默認包可見也行),語義明確:只給子類用
  • 若抽象類無構造器,編譯器生成無參構造器,子類 super() 正常工作
  • 抽象類構造器中不要調用抽象方法(子類尚未初始化,會拋 NPE/邏輯錯誤)

總結:抽象類構造器不是為「自己」服務,是為「孩子們」服務的——**封裝共性初始化邏輯,強制規範子類構造契約**。

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