使用 super() 构造函数时不会初始化空白的最终字段

问题描述

诚然,我对面向对象编程有点陌生,因此非常感谢您的帮助! 我有一个班级“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 中的最终变量 p2Strahl 没有在任何地方初始化!

因此,只需删除它们:

public class Strahl extends Gerade {
    private final Punkt start;
    public Strahl(Punkt a,b);
        this.start = a;
    }
}

另一个问题是@KonstantinPribluda 在他的回答中提到的。