super.a = b вместо super(b)

#java #inheritance #constructor #extends #super

#java #наследование #конструктор #расширяет #супер

Вопрос:

Я изучаю ключевое слово 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 ?

Ответ №1:

В Java нет «наследования конструктора». Если у суперкласса нет конструктора без аргументов, вы должны явно вызвать его конструктор (или один из них, если их несколько). Если вы этого не сделаете, вы получите ошибку компиляции.

Ответ №2:

Когда вы пишете свой класс A следующим образом:

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

вы перезаписываете конструктор по умолчанию и в строке this.a = a получаете доступ к переменной экземпляра и устанавливаете значения и в классе B:

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

вы пытаетесь получить доступ к переменным экземпляра класса B через конструктор, потому что super.a здесь супер ссылается на конструктор и его неправильно и выдает, Implicit super constructor A() is undefined. Must explicitly invoke another constructor что означает: в классе B он ищет конструктор, у которого нет параметра, потому что вы перезаписываете конструктор класса по умолчанию, и он не может распознать его, вызвав super.a = b soвы должны вызвать суперконструктор как функцию и в первой строке кода:

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