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当开工许可证??。最后说句大实话——下次再报构造方法错误时,先检查父类有没有穿着"无参构造"这件隐身衣!
本文由嘻道妙招独家原创,未经允许,严禁转载