Почему абстрактные классы в Java конструкторы? [дубликат]


этот вопрос уже есть ответ здесь:

почему abstract класс в Java есть constructor?

что он строит, так как мы не можем создать экземпляр abstract класса?

какие мысли?

7 55

7 ответов:

конструктор в Java фактически не" строит " объект, он используется для инициализации полей.

представьте, что ваш абстрактный класс имеет поля x и y, и что вы всегда хотите, чтобы они были инициализированы определенным образом, независимо от того, какой фактический конкретный подкласс в конечном итоге создается. Таким образом, вы создаете конструктор и инициализируете эти поля.

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

Если вы ничего не делаете, будет вызван конструктор по умолчанию родителя. Однако вы можете использовать ключевое слово super для вызова определенного конструктора в родительском классе.

все классы, включая абстрактные классы могут иметь конструкторы.Абстрактные конструкторы класса будут вызваны, когда его конкретный подкласс будет создан

две причины для этого:

1) абстрактные классы constructors и эти конструкторы всегда вызываются при создании экземпляра конкретного подкласса. Мы знаем, что когда мы собираемся создать экземпляр класса, мы всегда используем конструктор класса. Теперь каждый конструктор вызывает конструктор своего супер класс с неявным вызовом super().

2) мы знаем, что конструктор также используются для инициализации полей класса. Мы также знаем, что абстрактный классы могут содержать поля и иногда они должны быть инициализируется каким-то образом с помощью конструктора.

потому что другой класс может продлить его, и дочерний класс должен вызвать конструктор суперкласса.

потому что абстрактные классы имеют состояние (поля) и somethimes они должны быть инициализированы каким-то образом.

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

реализация мудрый вы часто будете видеть внутри super () заявление в конструкторах подклассов, что-то вроде:


public class A extends AbstractB{

  public A(...){
     super(String constructorArgForB, ...);
     ...
  }
}