问题描述
诚然,我对面向对象编程有点陌生,因此非常感谢您的帮助! 我有一个班级“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”类的某些属性和方法。坐标是 BigDecimals。只是为了让你不要混淆。
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;
}
解决方法
p1 和 p2 都要在 Gerade 的构造函数执行后初始化。但是由于复杂的控制流程,编译器无法保证会发生这种情况。仔细查看您的条件 - 如果不满足任何条件,您必须提供回退
,既然您正在调用 super(a,b)
,就没有理由在 Strahl
中重新声明它们。不用写p1.equals(p2) == true
,你可以简单地写p1.equals(p2)
。
可以是这样的
class Gerade {
private final Punkt p1 = null;
private final Punkt p2 = null;
public Gerade(Punkt p1,Punkt p2) {
if (p1.equals(p2)) {
System.out.println("Die Eingabe ist ungueltig. Beide Punkte haben die selben Koordinaten.");
p1 = null;
p2 = null;
}
// ...
}
}
class Strahl extends Gerade {
private final Punkt start;
public Strahl(Punkt a,Punkt b) {
super(a,b);
this.start = a;
}
}
我也建议你只在初始化时使用构造函数,任何业务逻辑都应该重构为一些方法。
,您的类 Punkt
中已经有两个 Gerade
实例变量。所以你不需要在你的课上重复它们Strahl
。
其实这是问题之一:p1
中的最终变量 p2
和 Strahl
没有在任何地方初始化!
因此,只需删除它们:
public class Strahl extends Gerade {
private final Punkt start;
public Strahl(Punkt a,b);
this.start = a;
}
}
另一个问题是@KonstantinPribluda 在他的回答中提到的。