Да, вам нужно вызвать супер-конструктор из конструктора B. Если вы не укажете this(...)
или super(...)
в начале конструктора, для вас будет вставлен неявный вызов super()
- вызов конструктора без параметров суперкласса. В этом случае у нет конструктора без параметров в A
- поэтому вам необходимо явно указать конструктор, который вы хотите вызвать, вместе с аргументами.
Скорее всего, вы не хотите другую переменную с именем s
внутри B, хотя ...
Я подозреваю, что вы хотите это:
class B extends A {
B(String s) {
super(s);
}
}
Важно понимать, что произойдет, если вы действительно также объявите переменную с именем s
в B
. Тогда у вас будет две независимые переменные для каждого экземпляра B
- одна объявлена в A
, а другая затеняет в B
. Они могут легко принимать разные значения ... что очень смущает.
Обратите внимание, что, кроме того, почти всегда неплохо делать поля приватными - в этот момент вы на самом деле не знаете , какие переменные объявляет ваш суперкласс, поскольку вы не можете получить к ним доступ. Если у вас случится , чтобы скрыть переменную, это по крайней мере не приведет к какой-либо явной двусмысленности (которая, конечно, обрабатывается спецификацией). Тем не менее, , как правило , является ошибкой, если одна переменная в своем суперклассе имеет то же имя, что и переменная, - это предполагает, что у вас есть два разных источника правды для одной и той же информации.