抽象类可定义带参构造方法,子类须用super(...)显式调用;抽象类不自动生成无参构造,若仅定义带参构造则子类必须显式调用;super(...)须为子类构造首句,且只能调用父类可见构造。

抽象类可以定义带参数的构造方法,子类通过 super(...) 显式调用它 —— 这和普通父类的构造调用规则完全一致,只是抽象类不能被直接实例化。
抽象类中定义带参构造方法
在抽象类中,你可以像在普通类中一样声明任意数量、任意参数类型的构造方法。Java 不会为抽象类自动生成无参构造器(除非你没写任何构造器,此时默认提供一个无参构造);一旦你写了带参构造,又没显式写无参构造,那抽象类就只有带参构造可用。
例如:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
abstract class Animal {
protected String name;
protected int age;
// 带参构造
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
// 也可以同时提供无参构造(可选)
public Animal() {
this("unknown", 0);
}
public abstract void makeSound();
}
子类必须显式调用父类构造方法
子类的每个构造方法,如果父类没有无参构造(或你不希望调用它),就必须在第一行使用 super(...) 调用抽象父类的某个构造方法。否则编译报错。
- 若抽象类只有带参构造,子类构造器里 必须 写
super(...) -
super(...)必须是子类构造方法的第一条语句 - 子类可选择调用父类任一可见构造(
public/protected),不一定是带参的 —— 只要父类提供了对应签名即可
子类构造示例
以下是一个继承 Animal 的具体类:
class Dog extends Animal {
private String breed;
// 必须调用 Animal 的构造(因为 Animal 没有默认无参构造,或你想传参初始化)
public Dog(String name, int age, String breed) {
super(name, age); // ← 关键:调用抽象父类的带参构造
this.breed = breed;
}
// 也可以封装一层:先调用父类无参构造,再赋值(前提是 Animal 提供了无参构造)
public Dog(String breed) {
super(); // ← 若 Animal 有 public Animal(),这句合法
this.breed = breed;
}
@Override
public void makeSound() {
System.out.println(name + " barks");
}
}
注意事项
- 抽象类的构造方法不能是 abstract(构造方法本身就不支持 abstract 修饰)
- 构造方法中的逻辑会在子类实例化时执行,可用于统一初始化父类字段
- 即使抽象类有多个构造方法,子类也只需在自己的每个构造中选一个合适的
super(...)调用即可 - 如果子类构造器没写
super(...),且父类没有无参构造,编译器会报错:“Implicit super constructor Animal() is undefined”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










