C++子类向父类传递构造函数参数问题咨询
解决父类无默认构造函数导致的子类构造错误
嘿,这个问题我太熟了!你遇到的是Java继承场景下构造函数调用的典型问题,我来帮你理清楚:
问题根源
当你创建子类对象时,Java编译器会自动尝试调用父类的默认(无参)构造函数,但你的Entry类只定义了带两个String参数的构造函数,没有提供无参的默认构造,所以编译器找不到对应的构造方法,就会抛出“父类不存在默认构造函数”的错误。
解决方案:显式调用父类带参构造函数
在子类musicAlbum的构造函数中,你必须用super()关键字显式调用父类的带参构造函数,而且这行代码必须是子类构造函数的第一条语句。
示例代码
父类Entry的实现
public class Entry { private String itemName; private String year; // 父类仅提供带参构造,无默认无参构造 public Entry(String itemName, String year) { this.itemName = itemName; this.year = year; } // 可以添加getter/setter等其他方法 }
子类musicAlbum的正确实现
public class musicAlbum extends Entry { private String artist; private String recordLabel; // 子类构造函数:先调用父类构造,再初始化自身属性 public musicAlbum(String itemName, String year, String artist, String recordLabel) { // 必须放在第一行,显式传入父类需要的两个参数 super(itemName, year); // 初始化子类自己的成员变量 this.artist = artist; this.recordLabel = recordLabel; } // 子类的其他方法... }
额外思路(不推荐除非必要)
如果你不想在子类构造中每次都写super(),也可以在父类Entry中添加一个无参构造函数:
public class Entry { // 添加无参构造 public Entry() { // 可以留空,或者给属性设置默认值 } // 原有的带参构造 public Entry(String itemName, String year) { this.itemName = itemName; this.year = year; } }
不过这种方式可能违背你设计Entry类的初衷——毕竟图书馆录入的物品应该必须有名称和年份,所以更推荐第一种显式调用父类带参构造的方案。
内容的提问来源于stack exchange,提问作者nicoopm
相关产品推荐
相关产品推荐

