当前位置: 首页 > 知识库问答 >
问题:

解析“构造函数调用必须是构造函数中的第一条语句”Java[duplicate]

颛孙星海
2023-03-14

我有一个班在Java延伸了另一个班

我需要构造函数来运行超级ctor

这是我的基本代码:

public class Polygon implements Geometry {



    public Polygon(Point3D... vertices) {
       ......
        }
    }

我想从子类中调用它

public class Triangle extends Polygon {

    //ctor
    public Triangle(Point3D point3d, Point3D point3d2, Point3D point3d3){
        List<Point3D> _temp = null;
        _temp.add(point3d);
        _temp.add(point3d2);
        _temp.add(point3d3);
        super(_temp);
    }

}

我怎么做,因为我得到错误“构造函数调用必须是构造函数中的第一个语句”,但我需要构建ctor

谢谢

共有2个答案

孔乐邦
2023-03-14

类三角形需要在第一行从构造函数调用super()。

    public Triangle(Point3D point3d, Point3D point3d2, Point3D point3d3){
        super(point3d, point3d2, point3d3);
    }
卫浩瀚
2023-03-14

super调用始终必须是构造函数主体的第一条语句。你改变不了的。

如果需要,您可以将列表构建代码提取到一个单独的静态方法中--但在本例中,您实际上并不需要列表--您只需要一个数组,因为超类point3d...顶点参数。所以你可以写:

public Triangle(Point3D point3d, Point3D point3d2, Point3D point3d3) {
    // The vertices parameter is a varargs parameter, so the compiler
    // will construct the array automatically.
    super(point3d, point3d2, point3d3);
}

请注意,如果您的原始代码已经编译,它仍然会以NullPointerException失败,因为您将尝试在_temp.add(...)为空时调用_temp.add(...)

如果您真的想要/需要一个helper方法,下面是一个示例:

public class Polygon implements Geometry{
    public Polygon(List<Point3D> vertices) {
        ...
    }
}

public class Triangle extends Polygon {
    public Triangle(Point3D point3d, Point3D point3d2, Point3D point3d3) {
        // The vertices parameter is a varargs parameter, so the compiler
        // will construct the array automatically.
        super(createList(point3d, point3d2, point3d3));
    }

    private static List<Point3D> createList(Point3D point3d, Point3D point3d2, Point3D point3d3) {
        List<Point3D> ret = new ArrayList<>();
        ret.add(point3d);
        ret.add(point3d2);
        ret.add(point3d3);
        return ret;
    }
}

请注意,在单个表达式中构造list 的方法非常流畅--这实际上只是为了说明如何调用静态方法,以便为超类构造函数提供参数。

 类似资料:
  • 如果将移到构造函数的最后一行,我不明白为什么下面的代码会显示错误。 我已经检查了很多关于StackOverflow的答案,但我仍然不能理解这其中的原因。请帮我用一些简单的例子和解释弄清楚这个错误。

  • 问题内容: 以下代码向我返回错误信息: 我不明白。我的代码中的构造函数是第一条语句。我究竟做错了什么? 问题答案: 构造函数名称必须与类名称相同,因此请将类名称更改为或将构造函数名称更改为。 示例 (请注意,在Java中通常第一个字母是大写字母) :

  • 这个Super()的替代品是什么;我代码中的语句...因为它向我显示了一个名为:构造函数调用必须是构造函数中的第一个语句的错误。

  • 可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 我想要一个在Java的建筑链。例如,对于第一个构造函数,我有一个字符串作为参数,并在从参数字符串创建对象时调用第二个构造函数。 但是,我得到了一个错误“构造函数调用必须是构造函数中的第一条语句”错误。 我制作了一个在两个构造函数之间共享的公共代码,但我不确定这是绕过这个问题的唯一解决方案。 为什么Java要求构造函数调

  • 问题内容: 我正在编写一个LoginRequest类的构造函数,该类扩展了一个名为JsobObjectRequest的类(来自Android的Volley框架,但这与问题完全无关) 使用此代码: 我收到错误:对super()的调用必须是构造函数主体中的第一条语句 相反,此代码可以正常编译: 但这实际上不是一回事吗?在这两种情况下,根据传递给子类构造函数的参数值,在调用超级构造函数之前都要进行一些简

  • 我正在编写一个LoginRequest类的构造函数,该类扩展了一个名为JsobObjectRequest的类(来自Android的凌空框架,但这与问题完全无关) 使用此代码: 我得到了一个错误:对super()的调用必须是构造函数体中的第一条语句 相反,这段代码编译得很好: 但事实上不是完全一样吗?在这两种情况下,在调用超级构造函数之前,都会根据传递给子类构造函数的参数值进行一些简单的计算。既然编