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

Java 我想知道什么';这是编译错误的根本原因。哪一个优先于另一个?,java,Java,有一个代码片段: DVD dvd = new DVD(10, 20); class-CD{ INTR; CD(INTR){ 这个。r=r; } } 类DVD扩展CD{ INTC; DVD(INTR,INTC){ //第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

有一个代码片段:

DVD dvd = new DVD(10, 20);
class-CD{
INTR;
CD(INTR){
这个。r=r;
}
}
类DVD扩展CD{
INTC;
DVD(INTR,INTC){
//第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的问题:

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

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

    Eclipse错误:

    想法错误:
    错误很简单:

    • 您只能对构造函数中的另一个构造函数进行一次调用。因此,调用
      super()
      this()
      是无效的
    • 正如您自己所想:
      this()
      的用法无效,因为相应的类中没有单参数构造函数
    问题第二部分的明确非答案:


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

    这实际上是一个实现细节。你看,从编译器外部看,唯一重要的是语言规范,它决定了编译器接受什么,输入的“意思”是什么,因此输出应该是什么

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


    显然,事物可能有一个“自然”的顺序被观察,导致类似的行为,但你可以(也不应该)对这种行为做出任何假设

    您试图实例化一个子类,其中父类只有一个构造函数使用int参数

    除非有默认构造函数,否则必须通过
    super(…)
    和显式调用父类的构造函数

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


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

    “我想知道编译错误的根本原因是什么。”这只是无效代码。编译器首先识别哪个错误有关系吗?这两种错误都会阻止代码通过编译。