super.a = b 而不是 super(b)

super.a = b instead of super(b)

我正在学习 super 关键字并且不小心得到了这个,这是一个例子:

    public class A {
       double a;
       public A (double a) {
          this.a = a;
       }
    }
    public class B extends A {
       public B (double b) {
          super.a = b;  //***
       }
    }

教程中的常用方法是 super(b) 重用其父构造函数,但是 super.a = b 有什么问题?

Java中没有“构造函数继承”。如果 super class 没有无参数构造函数,则必须显式调用其构造函数(如果有多个构造函数,则调用其中一个)。如果你不这样做,你会得到一个编译错误。

当你这样写 class A 时:

public class A {
    double a;
    public A(double a) {
        this.a = a;
    }
}

您覆盖了默认构造函数,在 this.a = a 行中您正在访问实例变量并设置值,在 class B:

public class B extends A {
    public B(double b) {
        super.a = b; // ***
    }
}

你试图通过构造函数访问 Class B 的实例变量,因为这里的 super.a ,超级引用构造函数及其错误并抛出 Implicit super constructor A() is undefined. Must explicitly invoke another constructor 这意味着: 在 Class B 它寻找一个没有参数的构造函数,因为你覆盖了 class 的默认构造函数并且它无法通过调用 super.a = b 来识别它所以你有将超级构造函数作为函数调用,并在第一行代码中:

public class B extends A {
    public B(double b) {
        super(b);
        super.a = b; // ***
    }
}