构造方法可以被继承吗?

结论先行

构造方法不能被继承

一、原因

  1. 继承的规则:子类继承父类的成员变量、普通成员方法,但构造方法不属于可继承的成员。
  2. 构造方法名字必须和当前类名一致:
    父类构造方法名是父类名,子类名和父类名不同,语法上就不可能继承过来。

二、虽然不能继承,但创建子类对象时一定会执行父类构造

子类构造方法第一行,默认隐藏 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();
    }
}

输出:

父类无参构造执行
子类构造执行

三、两种调用父类构造方式

  1. super():调用父类无参构造,不写也默认存在,必须放在子类构造第一行
  2. super(参数):调用父类有参构造,必须手动写,同样只能第一行

易错场景

如果父类只有有参构造,没有无参构造,子类不写 super(参数) 会直接报错:

class Father {
    // 只有有参构造,编译器不再提供默认无参构造
    public Father(String name) {}
}

class Son extends Father {
    public Son() {
        // 编译器默认插入 super(); 找不到父类无参构造 → 编译报错
    }
}

解决:手动调用父类有参构造

public Son() {
    super("张三");
}

四、补充:this() 和 super() 不能共存

this() 调用本类其他构造、super() 调用父类构造,都要求放在第一行,因此一个构造里不能同时出现。

总结

  1. 构造方法不能被继承
  2. 子类不会拥有父类的构造方法,不能直接 new Son().Father()
  3. 创建子类对象时,会通过 super() 触发父类构造,完成父类部分初始化;
  4. 父类有无参构造时子类不用手动写super,只有有参构造时子类必须手动 super(参数)
posted @ 2026-06-28 09:51  XIAHAJ8  阅读(4)  评论(0)    收藏  举报