我想知道编译错误的根本原因是什么。哪个优先于另一个?

时间:2019-01-14 09:23:25

标签: java

有一个代码片段:

class CD {

    int r;

    CD(int r) {
        this.r = r;

    }
}

class DVD extends CD {

    int c;

    DVD(int r, int c) {
        // line n1
    }
}

给出代码片段:

DVD dvd = new DVD(10, 20);

您应该在第n1行使用哪个代码片段成功实例化dvd对象?

A

super.r = r;
this.c = c;

B

super(r);
this(c);

C

super(r);
this.c = c;

D

this.c = r;
super(c);

正确答案是 C

我对 B 有疑问:

  1. this(c)不是该构造函数中的第一条语句(DVD(int r, int c)
  2. 类DVD 中没有单参数构造函数,this(c)无法调用它。

我想知道编译错误的根本原因是什么。哪个优先于另一个

Eclipse错误:
图片说明

IDEA错误:
图片说明

2 个答案:

答案 0 :(得分:0)

错误很简单:

  • 您只能一个调用一个构造函数中的另一个构造函数。因此,调用super()this()是无效的。
  • 如您所想:this()的用法无效,因为在相应的类中没有单参数构造函数

问题第二部分的一个明显的非答案:

  

我想知道导致编译错误的根本原因是什么。哪个优先于另一个

这实际上是一个实现细节。您会看到,编译器外部唯一重要的是语言规范,该规范确定了编译器接受什么,输入“含义”是什么,以及输出应该是什么。

结论:没有明确规定的错误“顺序”。编译器以看起来适合于编写它的人员的任何方式实现。因此,如上所述,如果在X之前先检测到错误X,则这完全取决于实现。另一个编译器可能会先告诉您有关Y的信息。

很明显,可能会有一个“自然”的顺序来观察事物,从而导致类似的行为,但是您不能(也不应)对此行为做出任何假设。

答案 1 :(得分:0)

您正在尝试实例化一个子类,其中父类只有一个带有int参数的构造函数。

除非有默认的构造函数,否则您必须通过super(...)this has to be the first statement in the constructor显式调用父类的构造函数。

直接消除A(不调用构造函数)和D(秒调用super)。

this(...)的调用也必须是构造函数中的第一条语句-这必然意味着您不能在同一构造函数中同时调用super(...)this(...)(也不能您两次调用this(...))。这样就消除了B