子类Square继承Rectangle时构造器参数不匹配编译错误求助
解决Java子类继承时的构造器编译错误
错误原因
当子类没有显式定义任何构造器时,Java编译器会自动生成一个默认的无参构造器。这个默认构造器的第一行会隐式调用父类的无参构造器(super();)。但你的Rectangle类只提供了带5个参数的构造器,没有定义无参构造器,导致编译器找不到可调用的父类无参构造器,因此抛出参数不匹配的编译错误。
临时编译通过的解决方法
方法1:给Square添加显式构造器,显式调用父类带参构造器
这是最规范的方式,结合正方形宽高相等的特性,在子类构造器中统一传入边长,再调用父类构造器:
public class Square extends Rectangle { public Square(String t, String n, String c, double side) { // 调用父类带参构造器,将宽和高都设为边长 super(t, n, c, side, side); } }
此时编译器不会生成默认无参构造器,而是使用你定义的构造器,显式调用父类的带参构造器,直接解决编译问题。
方法2:给Rectangle临时添加无参构造器(仅用于临时编译)
如果你只是想先让代码编译,后续再修改Rectangle的构造器,可以给Rectangle补充一个无参构造器:
public class Rectangle { // 原有的带参构造器 public Rectangle(String t,String n, String c, double w, double h ){ width = w; height = h; color = c; name = n; type = t; } // 临时添加的无参构造器 public Rectangle() { // 可设置默认值(如width=0, height=0),或空实现 } }
此时子类的默认无参构造器能找到父类的无参构造器,编译即可通过,但这种方式不符合面向对象设计逻辑,仅作为临时过渡方案。
关于你之前尝试的问题说明
你之前复制父类构造器到子类并改名为Square但报错,是因为子类构造器默认会隐式调用父类无参构造器——即使你写了带参的子类构造器,只要没有显式写super(...)调用父类带参构造器,编译器还是会在构造器第一行自动添加super();,导致找不到父类无参构造器而报错。必须在子类构造器的第一行显式调用父类的带参构造器才能解决。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

