构造方法可以被继承吗?
结论先行
构造方法不能被继承。
一、原因
- 继承的规则:子类继承父类的成员变量、普通成员方法,但构造方法不属于可继承的成员。
- 构造方法名字必须和当前类名一致:
父类构造方法名是父类名,子类名和父类名不同,语法上就不可能继承过来。
二、虽然不能继承,但创建子类对象时一定会执行父类构造
子类构造方法第一行,默认隐藏 super(),代表调用父类无参构造:
class Father {
// 父类构造
public Father() {
System.out.println("父类无参构造执行");
}
}
class Son extends Father {
// 子类构造
public Son() {
// 这里默认隐藏了 super();
System.out.println("子类构造执行");
}
}
public class Test {
public static void main(String[] args) {
new Son();
}
}
输出:
父类无参构造执行
子类构造执行
三、两种调用父类构造方式
super():调用父类无参构造,不写也默认存在,必须放在子类构造第一行super(参数):调用父类有参构造,必须手动写,同样只能第一行
易错场景
如果父类只有有参构造,没有无参构造,子类不写 super(参数) 会直接报错:
class Father {
// 只有有参构造,编译器不再提供默认无参构造
public Father(String name) {}
}
class Son extends Father {
public Son() {
// 编译器默认插入 super(); 找不到父类无参构造 → 编译报错
}
}
解决:手动调用父类有参构造
public Son() {
super("张三");
}
四、补充:this() 和 super() 不能共存
this() 调用本类其他构造、super() 调用父类构造,都要求放在第一行,因此一个构造里不能同时出现。
总结
- 构造方法不能被继承;
- 子类不会拥有父类的构造方法,不能直接
new Son().Father(); - 创建子类对象时,会通过
super()触发父类构造,完成父类部分初始化; - 父类有无参构造时子类不用手动写super,只有有参构造时子类必须手动
super(参数)。

浙公网安备 33010602011771号