接口不能定义构造方法,抽象类可以定义构造方法。接口是行为契约,无实例状态,故禁止构造方法;抽象类具完整类结构,其构造方法在子类创建对象时被调用,用于初始化继承字段和公共逻辑,且子类必须通过super()显式或隐式调用。

接口不能定义构造方法,抽象类可以定义构造方法。
接口中无法定义构造方法
接口是纯粹的行为契约,不涉及对象初始化过程。它没有实例状态,也不参与对象创建流程,因此语法上禁止声明任何构造方法。试图写 interface I { I() {} } 会直接编译失败。
接口允许的成员仅限于:
- public static final 字段(常量)
- public abstract 方法(Java 8+ 还支持 default 和 static 方法)
抽象类可以定义构造方法
抽象类虽不能被 new 实例化,但它仍是类,具备完整的类结构。它的构造方法在子类创建对象时被隐式或显式调用,用于初始化继承来的字段和执行公共逻辑。
立即学习“Java免费学习笔记(深入)”;
定义方式与普通类完全一致:
- 方法名必须与类名相同
- 无返回类型(连 void 都不能写)
- 推荐使用 protected 修饰,既允许子类调用,又防止外部误用
- 不可用 private —— 否则子类无法访问,编译报错
子类如何调用抽象父类的构造方法
Java 要求子类构造器第一行必须调用父类构造器,这条规则对抽象类同样生效:
- 若抽象类有无参构造,子类可省略 super(),编译器自动插入
- 若抽象类只有带参构造,子类必须在第一行写 super(参数)
- super() 必须是子类构造器的第一条语句,不能和 this() 共存
构造方法在抽象类中的典型用途
不是为了自身实例化,而是为所有子类提供统一、安全的初始化入口:
- 初始化 protected 或包级私有字段(如 name、timeout)
- 封装参数校验逻辑(如非空、范围检查),避免子类遗漏
- 设置 final 字段(只能在构造中赋值一次)
- 准备共享资源引用(如 Logger、配置对象)
注意:构造方法中不能调用抽象方法,否则可能触发未定义行为。


















