конструкторы в Java - PullRequest
       6

конструкторы в Java

0 голосов
/ 03 сентября 2011
public class A {
public A() {
    System.out.println("a1");
}
public A(int x) {
    System.out.println("a2");

}}

public class B extends A {
public B() {
    super(5);
    System.out.println("b1");
}
public B(int x) {
    this();
    System.out.println("b2");
}
public B(int x, int y) {
    super(x);
    System.out.println("b3");
}}

Я не понимаю, почему конструкция A по умолчанию не применяется при запуске B b= new B();

B расширяет A, поэтому сначала мы называем конструкцию A, которая должна печатать «a1», а затем мы называем вторую структуру A, которая печатает «a2», а B() печатает «b1», но когда я запустить его, он печатает только «a2, b1», так что, очевидно, A() не применяется в начале - почему?

Ответы [ 4 ]

4 голосов
/ 03 сентября 2011

Когда вы говорите B b = new B();, вы вызываете конструктор по умолчанию, который

public B() {
    super(5);
    System.out.println("b1");
}

Так как он уже имеет вызов своего суперконструктора [super(5)], поэтому компилятор не будет вставлять неявное значение по умолчаниюконструктор.Отсюда и результат.

ПРИМЕЧАНИЕ. Из вашего вопроса кажется, что у вас есть идея, что все конструкторы вызываются при создании объекта.Я боюсь, что это неправильно.Будет вызван только тот конструктор , который вы явно вызываете для создания объекта.И если этот конструктор вызывает другой конструктор через метод this(), только тогда будут вызываться другие конструкторы.

2 голосов
/ 03 сентября 2011

Я думаю, вы не поняли, как Java обрабатывает конструкторы.Прежде всего, по умолчанию Java будет вызывать только один конструктор на класс, если вы явно не скажете ему вызывать more, используя this(...).Во-вторых, эта вызываемая конструкция является конструктором по умолчанию суперкласса (поэтому он будет вызывать super(), а не this());так что класс A на самом деле выглядит так:

public class A {
  public A() {
     super(); // implicit call to super(), which is Object()
     System.out.println("a1");
  }
  public A(int x) {
    super(); // implicit call to super(), which is Object()
    System.out.println("a2");
  }
}

Таким образом, вызов A() будет неявно вызывать Object(), однако вызов A(int x) будет также неявно вызывать Object(),а не - как вы, похоже, предполагаете - A().

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

   public class B extends A {
      public B() {
        super(5); // explicit call to A(5), no implict call to A()
        System.out.println("b1");
      }
      public B(int x) {
        this(); // explicit call to B(), no implicit call to A()
        System.out.println("b2");
      }
      public B(int x, int y) {
        super(x); // explict call to A(x), no implicit call to A()
        System.out.println("b3");
      }
    }

Итак, еще раз, важно помнить, что Java вставит вызов в super() в первомстрока любого конструктора, если вы явно не вызываете другой конструктор, используя this(...) или super(...).Он никогда не вставит this() сам по себе.

2 голосов
/ 03 сентября 2011

B расширяет A, поэтому сначала мы называем конструкцию A, которая должна вывести «a1»

Это утверждение неверно.В классе B ваш конструктор без аргументов

public B() {
    super(5);
    System.out.println("b1");
}

вызывает конструктор суперкласса (класса A), который принимает параметр int.

public A(int x) {
    System.out.println("a2");
}

Вы никогда не вызовете super () , поэтому конструктор, который печатает «a1», не будет вызываться при вызове любого из конструкторов B.

Вызов супер-конструктора должен быть первой строкой конструктора.Если вы хотите вызвать конструктор без аргументов суперкласса (в данном случае тот, который печатает «a1»), вы должны написать ...

public B() {
    super();
    System.out.println("b1");
}

Если вы не укажете вызов супер-конструкторатогда java автоматически вызовет супер-конструктор без аргументов.

2 голосов
/ 03 сентября 2011

Это потому, что вы вызываете super (5) в конструкторе B, который вызывает второй конструктор A вместо первого.

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