诚然,我对面向对象编程有点陌生,因此非常感谢您的帮助!我有一个“gerade”(德语中的直线)和一个“strahl”(德语中的雷)班。我想调用子类“strahl”中的超类“gerade”的构造函数。但是现在我得到了错误:“空白的最后一个字段P1[和P2]可能没有被初始化”。原因是什么?我非常感谢你的回答。提前谢谢!
public class Gerade {
private final Punkt p1;
private final Punkt p2;
public Gerade(Punkt p1, Punkt p2)
{
if(p1.equals(p2)==true)
{
System.out.println("Die Eingabe ist ungueltig. Beide Punkte haben die selben Koordinaten.");
p1 = null;
p2 = null;
}
if(p1.getXkoord().equals(p2.getXkoord())==true)
{
if((p1.getYkoord().compareTo(p2.getYkoord()) < 0))
{
this.p1 = p1;
this.p2 = p2;
}
else
{
this.p1 = p2;
this.p2 = p1;
}
}
else if((p1.getXkoord().compareTo(p2.getXkoord()) > 0))
{
this.p2 = p1;
this.p1 = p2;
}
else
{
this.p1 = p1;
this.p2 = p2;
}
}
类“gerade”使用类“punkt”的某些属性和方法。坐标是大小数。只是为了让你不困惑。
public class Strahl extends Gerade
{
private final Punkt p1;
private final Punkt p2;
private final Punkt start;
public Strahl(Punkt a, Punkt b)
{
super(a, b);
this.start = a;
}
3条答案
按热度按时间g2ieeal71#
你已经有两个了
Punkt
类中的示例变量Gerade
. 所以你不需要在课堂上重复Strahl
.事实上,这就是问题之一:最终变量
p1
以及p2
在Strahl
任何地方都没有初始化!因此,只需删除它们:
另一个问题是@konstantinpribluda在他的回答中提到了什么。
iih3973s2#
既然你打电话来
super(a, b)
,没有理由在中重新声明它们Strahl
. 而不是写作p1.equals(p2) == true
,你可以简单地写p1.equals(p2)
.它可以是
我还建议您仅在初始化时使用构造函数,任何业务逻辑都应重构为某些方法。
wmvff8tz3#
p1和p2都应在执行gerade的构造函数后初始化。但由于复杂的控制流,编译器不能保证这一点。仔细看看你的条件——如果没有一个条件得到满足,你就必须提供后备方案