构造器实参与形参长度不匹配:Circle类构造器报错求助
解决Java子类构造器的参数不匹配错误
这个问题其实是Java继承机制里的常见小坑,咱们一步步拆解解决:
错误原因
在Java中,子类构造器默认会自动调用父类的无参构造器(也就是super()),但你的Shape抽象类只定义了一个带参数的构造器:
protected Shape(DrawAPI drawAPI){ this.drawAPI = drawAPI; }
它没有无参构造器,所以当你在Circle的构造器里没显式调用super(drawAPI)时,编译器会尝试插入默认的super(),但父类根本不存在这个构造器,就会抛出「Actual and formal arguments differ in length」的错误。
解决方案
唯一靠谱的做法是在Circle构造器的第一行显式调用父类的带参构造器——记住,super()必须是构造器里的第一条语句,修正后的代码如下:
class Circle extends Shape { private int x, y, radius; public Circle(int x, int y, int radius, DrawAPI drawAPI) { super(drawAPI); // 必须放在构造器第一行,显式传递父类需要的参数 this.x = x; this.y = y; this.radius = radius; } public void draw() { drawAPI.drawCircle(radius,x,y); } }
额外提醒
有人可能会想:给Shape加个无参构造器行不行?比如:
protected Shape() {}
虽然能糊弄过编译器,但这样drawAPI会被初始化为null,调用draw()方法时直接就会抛出NullPointerException,完全违背了你设计抽象类的初衷,这种做法绝对不推荐。
内容的提问来源于stack exchange,提问作者lasan
相关产品推荐
相关产品推荐

