疑問:構造器是為初始化對象服務的,抽象類不能 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() 正常工作總結:抽象類構造器不是為「自己」服務,是為「孩子們」服務的——**封裝共性初始化邏輯,強制規範子類構造契約**。