Ошибка конструктора Java - PullRequest
0 голосов
/ 05 июня 2011

Я получаю ошибку конструктора.Чтобы этот код работал, мне нужно использовать super в классе B?

 class A {  
      protected String s ;
      A (String s) {
           this.s = s  ; 
         }
  }

 class B extends A {
     String s ;
     B(String s) {
        this.s  = s ;    
         }
   }

Ответы [ 5 ]

5 голосов
/ 05 июня 2011

Да, вам нужно вызвать супер-конструктор из конструктора B. Если вы не укажете this(...) или super(...) в начале конструктора, для вас будет вставлен неявный вызов super() - вызов конструктора без параметров суперкласса. В этом случае у нет конструктора без параметров в A - поэтому вам необходимо явно указать конструктор, который вы хотите вызвать, вместе с аргументами.

Скорее всего, вы не хотите другую переменную с именем s внутри B, хотя ...

Я подозреваю, что вы хотите это:

class B extends A {
    B(String s) {
        super(s);
    }
}

Важно понимать, что произойдет, если вы действительно также объявите переменную с именем s в B. Тогда у вас будет две независимые переменные для каждого экземпляра B - одна объявлена ​​в A, а другая затеняет в B. Они могут легко принимать разные значения ... что очень смущает.

Обратите внимание, что, кроме того, почти всегда неплохо делать поля приватными - в этот момент вы на самом деле не знаете , какие переменные объявляет ваш суперкласс, поскольку вы не можете получить к ним доступ. Если у вас случится , чтобы скрыть переменную, это по крайней мере не приведет к какой-либо явной двусмысленности (которая, конечно, обрабатывается спецификацией). Тем не менее, , как правило , является ошибкой, если одна переменная в своем суперклассе имеет то же имя, что и переменная, - это предполагает, что у вас есть два разных источника правды для одной и той же информации.

2 голосов
/ 05 июня 2011

Да, вам нужно позвонить в класс A, используя super();

Помните, ваш подкласс обеспечит автоматический (super()) вызов конструктора суперкласса, только и только если у вас есть конструктор без аргументов в суперклассе.

Как только вы определили параметризованный конструктор для своего суперкласса, вашему подклассу требуется вызов super(); от его конструктора.Всякий раз, когда ваш подкласс наследует от суперкласса, вам необходимо вызвать суперкласс, используя super();.

Вам необходимо переписать код класса B следующим образом:

class B extends A {
    B(String s) {
        super(s);   // Calls A's constructor ..
    }
}

Примечание: super(s); должно быть первым утверждением вКонструктор Б.

1 голос
/ 05 июня 2011

Краткий ответ: да.

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

В случае, когда у суперкласса нет конструктора без аргументов, вам нужно будет самостоятельно указать аргументы (и, следовательно, сделать вызов), например:

class B extends A {
    String s;
    public B(String s) {
        super(s); // Or pass in any other argument to super's constructor
        this.s = s;
    }
0 голосов
/ 05 июня 2011

Прежде всего, вам не нужно создавать одну и ту же переменную и конструктор в B, потому что они уже существуют (B расширяет A).Вы можете сделать что-то вроде этого:

public class test {
A a = new A ("This is a");
B b = new B ("This is b");
    private class A {  
        protected String s ;
        A ( String s ) {  this.s = s; }
        public String getS() { return s; }
    }
    private class B extends A {
        B (String s) { super (s); }
    }

    public static void main (String [] args) {
        test t = new test();

        System.out.println(t.a.getS());
        System.out.println(t.b.getS());

        /*
Output will be This is a and This is b
         */
    }
}

Вы правы, что вам нужно позвонить на super(s);

Удачи!

0 голосов
/ 05 июня 2011
class A {
    protected String s ;
    A(String s) {
        this.s = s;
    }
}
class B extends A {
    B(String s) {
        super(s);
    }
}

Ваше поле String s в классе B скрывает поле с тем же именем в классе A.Если вам нужно отдельное поле String в B, вам следует назвать его как-нибудь еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...