
在 Java 中,子类构造器需通过 super() 显式调用父类构造器来初始化继承的数据成员;直接使用父类名(如 card(...))会被误认为调用方法,导致编译错误。
在 java 中,子类构造器需通过 `super()` 显式调用父类构造器来初始化继承的数据成员;直接使用父类名(如 `card(...)`)会被误认为调用方法,导致编译错误。
在面向对象编程中,子类继承父类成员后,其自身构造器不会自动调用父类构造器——尤其当父类仅定义了带参构造器而未提供无参构造器时,Java 编译器不会插入默认的 super() 调用,此时必须显式使用 super(...) 来完成父类字段的初始化。
你遇到的错误:
error: method card is undefined for the type creditcard
根本原因在于:card(num, c_name, b_name); 这一行被 Java 解析为「尝试调用名为 card 的实例方法」,但 card 是类名而非方法,且该类中并未声明同名方法,因此编译失败。
✅ 正确做法是使用 super(...) 关键字,它专用于从子类构造器中调用直接父类的构造器,并确保父类数据成员(如 cardno、cust_name、bank_name)被正确赋值:
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;
}
// 提供无参构造器(可选,但显式写出更清晰)
public 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(1, "A", "B"));
- 不要混淆 super()(调用父类构造器)与 this()(调用本类其他构造器),二者不可共存于同一构造器中;
- 推荐遵循 Java 命名规范:类名使用 PascalCase(如 Card, CreditCard),字段名使用 camelCase(如 cardNo, custName),提升代码可读性与专业性。
总结:super() 是连接父子类构造逻辑的桥梁,它保障了继承链上数据成员的有序初始化。掌握其用法,是编写健壮、可维护继承结构的基础。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











