构造函数时,不初始化java-blank final字段

siotufzp  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(329)

诚然,我对面向对象编程有点陌生,因此非常感谢您的帮助!我有一个“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;

    }
g2ieeal7

g2ieeal71#

你已经有两个了 Punkt 类中的示例变量 Gerade . 所以你不需要在课堂上重复 Strahl .
事实上,这就是问题之一:最终变量 p1 以及 p2Strahl 任何地方都没有初始化!
因此,只需删除它们:

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

另一个问题是@konstantinpribluda在他的回答中提到了什么。

iih3973s

iih3973s2#

既然你打电话来 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;
    }
}

我还建议您仅在初始化时使用构造函数,任何业务逻辑都应重构为某些方法。

wmvff8tz

wmvff8tz3#

p1和p2都应在执行gerade的构造函数后初始化。但由于复杂的控制流,编译器不能保证这一点。仔细看看你的条件——如果没有一个条件得到满足,你就必须提供后备方案

相关问题