在 Java 中,子类构造器需通过 super() 显式调用父类构造器来初始化继承的数据成员;直接使用父类名(如 card(...))会导致编译错误,因其被误认为是方法调用而非构造器委托。
在 java 中,子类构造器需通过 `super()` 显式调用父类构造器来初始化继承的数据成员;直接使用父类名(如 `card(...)`)会导致编译错误,因其被误认为是方法调用而非构造器委托。
在面向对象编程中,继承关系下的构造器协作至关重要。当子类需要初始化从父类继承的字段(如 cardno、cust_name、bank_name)时,必须通过 super(...) 调用父类对应的构造器——这是 Java 的强制语法规则。你原代码中写的是 card(num, c_name, b_name);,这会被编译器解释为尝试调用名为 card 的普通实例方法,而该方法并不存在,因此报错:“method card is undefined for the type creditcard”。
✅ 正确做法是:在子类构造器的第一行,使用 super(参数列表) 显式委托父类构造逻辑:
class Card { // 建议类名首字母大写(Java 命名规范)
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(),导致编译失败;
- this(...) 和 super(...) 不能共存于同一构造器中;
- 推荐遵循 Java 命名规范:类名使用 PascalCase(如 Card、CreditCard),字段名使用 camelCase(如 cardNo)。
总结:super 关键字是子类与父类构造流程衔接的唯一合法桥梁。掌握其用法,不仅能解决初始化问题,更是理解 Java 对象创建生命周期的关键一步。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











