
本文详解 Java 中通过 super() 在子类构造器中调用父类构造器,从而初始化继承自父类的数据成员;重点纠正直接调用父类类名(如 card(...))的常见错误,并说明 super 的语法要求与执行时机。
本文详解 java 中通过 `super()` 在子类构造器中调用父类构造器,从而初始化继承自父类的数据成员;重点纠正直接调用父类类名(如 `card(...)`)的常见错误,并说明 `super` 的语法要求与执行时机。
在 Java 中,子类无法直接通过父类名称(如 card(...))调用父类构造器——这会被编译器识别为方法调用,而父类 card 并未定义名为 card 的实例方法,因此报错 “method card is undefined for the type creditcard”。正确做法是使用 super() 关键字显式调用父类构造器,且该调用必须作为子类构造器的第一条语句。
以下是修正后的完整代码示例:
class Card { // 建议遵循驼峰命名规范:Card 而非 card
int cardNo;
String custName;
String bankName;
public Card(int num, String cName, String bName) {
this.cardNo = num;
this.custName = cName;
this.bankName = bName;
}
// 提供无参构造器(可选,但若父类仅有带参构造器,子类必须显式调用 super(...))
Card() {}
}
class CreditCard extends Card {
int limit;
public CreditCard(int num, String cName, String bName, int lim) {
super(num, cName, bName); // ✅ 正确:调用父类构造器,必须为第一行
this.limit = lim;
}
}
⚠️ 关键注意事项:
- super(...) 不是方法调用,而是构造器链的显式委托指令,只能出现在子类构造器首行;
- 若父类没有无参构造器,且子类构造器未显式调用 super(...),编译器会默认插入 super(),导致编译失败;
- super 只能用于访问父类的可见成员(public/protected 或同包默认访问),私有成员需通过父类提供的公共方法间接访问;
- 构造器本身不被继承,因此子类必须通过 super() 主动复用父类初始化逻辑,确保父类字段(如 cardNo、custName)被正确赋值。
✅ 总结:super() 是 Java 实现构造器复用与继承初始化的核心机制。牢记“先父后子”原则——父类状态必须在子类状态初始化前完成构建,这是保障对象完整性和多态安全的基础。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











