Java对象声明时传入参数不被编译器识别的报错如何修复?
问题排查与修复方案
核心报错原因
Main类不必要地继承了Quadrilateral类:Java中如果子类没有显式定义构造方法,编译器会自动生成无参构造方法,该构造会默认调用父类的无参构造。但Quadrilateral仅提供了需要4个Point参数的构造方法,没有无参构造,因此触发参数不匹配的编译错误,报错提示中at quadrilateral.Main.(Main.java:1)也指向该问题。- 类设计逻辑错误:
Quadrilateral(四边形)继承Point(点)不符合面向对象is-a的继承规则,四边形属于包含多个点的图形,应该用组合而非继承实现。 - 代码存在未声明的成员变量:
Point类中的x、y,Quadrilateral类中的p_1、p_2、p_3、p_4都没有提前声明,Trapezoid类也没有实现getArea()方法,会触发后续编译错误。
修复方案
步骤1:移除Main类的继承关系
Main作为启动类不需要继承任何业务类,修改后代码如下:
public class Main { public static void main(String[] args) { Trapezoid trap = new Trapezoid(new Point(1,5),new Point(5,5), new Point(2,7), new Point(4,7)); System.out.println(trap.getArea()); } }
步骤2:修正Point类定义,补充成员变量
public class Point{ // 补充成员变量声明 protected int x, y; Point(int x_pass,int y_pass) { this.x = x_pass; this.y = y_pass; } }
步骤3:修正Quadrilateral类的继承关系和成员定义
移除对Point的继承,补充成员变量声明:
import java.lang.Math; public class Quadrilateral { // 补充成员变量声明 protected Point p_1, p_2, p_3, p_4; Quadrilateral(Point p1, Point p2, Point p3, Point p4) { this.p_1 = p1; this.p_2 = p2; this.p_3 = p3; this.p_4 = p4; } }
步骤4:补充Trapezoid类的getArea方法实现
示例逻辑基于梯形面积公式:(上底+下底)*高/2:
public class Trapezoid extends Quadrilateral{ Trapezoid(Point p1, Point p2, Point p3, Point p4) { super(p1,p2,p3,p4); } public double getArea() { // 计算上下底长度、高度,可根据实际坐标逻辑调整计算规则 double bottom = Math.sqrt(Math.pow(p_2.x - p_1.x, 2) + Math.pow(p_2.y - p_1.y, 2)); double top = Math.sqrt(Math.pow(p_4.x - p_3.x, 2) + Math.pow(p_4.y - p_3.y, 2)); double height = Math.abs(p_3.y - p_1.y); return (top + bottom) * height / 2; } }
内容的提问来源于stack exchange,提问作者Thomas Watson
相关产品推荐
相关产品推荐

