1. 主页 > 大智慧

Java构造方法继承必知:子类调用父类构造方法注意事项

昨天有个学员问我:"老师,我照着教程写了个子类,为什么一new对象就报错?" 打开代码一看,好家伙,父类构造方法写着汽车(String 型号),子类构造方法里却空空如也。今天就说说这个让新手集体翻车的坑——??子类构造方法怎么正确调用父类??。

(想起刚学Java那会儿,我也因为漏写super被编译器骂了一下午...)


一、装修队原理:先打地基再盖楼

把构造方法继承想象成装修房子。父类是毛坯房结构,子类是精装修。??子类构造方法必须先把父类的框架搭好??。看这段必错代码:

java复制
class 手机 {
    手机(int 电量) {
        System.out.println("初始电量:" + 电量);
    }
}

class 智能手机 extends 手机 {
    智能手机() { 
        // 这里埋着地雷
    }
}

运行时会报错:父类没有无参构造方法。??正确姿势??就像装修队先做水电改造:

java复制
智能手机() {
    super(80);  // 相当于先装好电路
    System.out.println("加载安卓系统");
}

二、三大必坑指南

1. ??super必须当排头兵??

子类构造方法里,super调用必须放在第一行。去年有个学生写了这样的代码:

java复制
智能手机() {
    System.out.println("加载人脸识别"); // 装修工先贴壁纸
    super(80);  // 后砸承重墙
}

结果编译器直接报错——??顺序颠倒就像先刷墙再铺电线??,注定要返工。

2. ??参数要对得上暗号??

父类构造方法如果是手机(String 型号,int 价格),子类super必须传两个参数。常见错误就像这样:

java复制
super("苹果");  // 少传一个参数
// 或者
super(14, "Pro", 6999);  // 多传参数

3. ??无参构造的幽灵事件??

当父类没有无参构造时,子类必须显式调用其他构造方法。很多新手会遇到这种情况:

java复制
class 父类 {
    父类(String 名字) { /* 有参构造 */ }
}

class 子类 extends 父类 {
    子类() { 
        // 自动找父类无参构造,结果找不到
    }
}

??解决方案??就像给快递员写清楚地址:

java复制
子类() {
    super("默认名称");  // 明确指定
}

三、自问自答急救包

??Q:能不能不写super调用???
A:两种情况可以:①父类有无参构造 ②你手动调用了其他构造方法。就像装修队如果毛坯房自带水电,可以直接开工

??Q:父类有多个构造方法怎么办???
A:选一个合适的来调用,就像选装修套餐:

java复制
super();  // 选无参套餐
super("特斯拉", 300000);  // 选顶配套餐

??Q:super和this()能同时用吗???
A:??鱼和熊掌不可兼得??!构造方法里super()和this()只能二选一,且必须放在第一行


四、血泪经验对照表

错误操作正确姿势
忘记写super调用显式指定父类构造方法
super不是首行语句调整代码顺序
参数类型不匹配保持参数列表一致
依赖默认无参构造主动声明父类构造

举个充电宝案例:

java复制
class 充电宝 {
    充电宝(int 容量) {
        System.out.println(容量 + "毫安时");
    }
}

class 快充充电宝 extends 充电宝 {
    快充充电宝() {
        super(20000);  // 明确容量值
        System.out.println("支持PD快充");
    }
}

个人观点

带过上百个Java新手后发现,构造方法继承的问题都出在??三个不??:不理解执行顺序、不注意参数匹配、不主动声明super。记住两个绝招:??把父类当装修队指挥??、??把super当开工许可证??。最后说句大实话——下次再报构造方法错误时,先检查父类有没有穿着"无参构造"这件隐身衣!

本文由嘻道妙招独家原创,未经允许,严禁转载