我有一个班在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
谢谢
类三角形需要在第一行从构造函数调用super()。
public Triangle(Point3D point3d, Point3D point3d2, Point3D point3d3){
super(point3d, point3d2, point3d3);
}
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()的调用必须是构造函数体中的第一条语句 相反,这段代码编译得很好: 但事实上不是完全一样吗?在这两种情况下,在调用超级构造函数之前,都会根据传递给子类构造函数的参数值进行一些简单的计算。既然编