Неправильное использование 'super' в расширенных конструкторах классов

1

Я думал, что понял, что делает супер, однако я не могу понять, почему в следующем коде

class test {
    int i;

    test(int i){
    this.i = i;
}

}    
class testSub extends test{ 

    testSub(int i) {
        super(i);
    }

    /*testSub(int i) {
        this.i = i;
    }*/
}

почему бы второй конструктор (заработал) работать? он делает то же самое..

Спасибо за любые разъяснения :)

EDIT: Спасибо всем - извините, я не могу отметить больше ответов. Также жаль, если это не должно быть правкой.

Быстрое повторение: поскольку testSub является дочерним элементом родительского теста, хотя конструктор делает то же самое, ребенок должен состоять из его родительской части. Только если у теста был конструктор по умолчанию, это было бы возможно. Если я не понял это правильно, ответьте.

Теги:
polymorphism
super

4 ответа

0
Лучший ответ

Выполнение того же самого - это не то же самое, что быть одним и тем же. Компилятор не собирается проверять, что вы позаботились о том, что супер должно делать. Это просто будет настаивать на том, что вы называете это, когда это требуется.

1

У вашего test класса есть явный конструктор. Вы должны использовать этот конструктор в конструкторе каждого подкласса.

Если у test не было явного конструктора, будет создан неявный конструктор без аргументов, и вам не придется явно ссылаться на него в подклассе. В этой ситуации ваш второй конструктор будет абсолютно прав.

class test {
    int i;
}

class testSub extends test{ 

    testSub(int i) {
        this.i = i;
    }
}
0

Конструктор вашего класса всегда будет вызывать один из конструкторов суперкласса.

Вы можете сделать вызов явным с super (первая инструкция конструктора), и в этом случае вы можете выбрать, какой конструктор вы вызовете.

Если вы явно не используете super, он попытается использовать конструктор по умолчанию (без параметров). Но ваш суперкласс не имеет его, поэтому он не сможет скомпилировать.

Самое простое решение - явно объявить конструктор без параметров в вашем суперклассе. Тем не менее, всегда лучше использовать родительские методы, когда это возможно, поэтому, если в итоге результат будет таким же, он будет более изящным, используя super(i).

0

Как ясно говорит вам ошибка, вы должны вызвать конструктор базового класса, или базовый класс не будет создан.

Выполнять то же, что и конструктор базового класса, недостаточно; вы действительно должны это назвать.

Если базовый класс имеет конструктор без параметров (например, конструктор по умолчанию, если вы его не пишете), вы можете его оставить, и компилятор автоматически вызовет его.

  • 1
    Вы можете упомянуть, что у каждого класса в Java есть конструктор по умолчанию без параметров, если вы не предоставляете никакого конструктора. Это реальная причина, код не работает: test не предоставляет конструктор без параметров.
  • 0
    @ Turing85: Добавлено.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню