Почему класс abstract
в Java имеет constructor
?
Что это такое, поскольку мы не можем создать экземпляр класса abstract
?
Любые мысли?
Почему класс abstract
в Java имеет constructor
?
Что это такое, поскольку мы не можем создать экземпляр класса abstract
?
Любые мысли?
Конструктор в Java фактически не "строит" объект, он используется для инициализации полей.
Представьте, что ваш абстрактный класс имеет поля x и y и что вы всегда хотите, чтобы они были инициализированы определенным образом, независимо от того, какой конкретный конкретный подкласс в конечном итоге будет создан. Таким образом, вы создаете конструктор и инициализируете эти поля.
Теперь, если у вас есть два разных подкласса вашего абстрактного класса, когда вы создаете их, их вызовы будут вызываться, а потом родительский конструктор будет вызван и поля будут инициализированы.
Если вы ничего не сделаете, будет вызываться конструктор по умолчанию родителя. Однако вы можете использовать ключевое слово super для вызова конкретного конструктора родительского класса.
Все классы, в том числе абстрактные классы, могут иметь конструкторы. Конструкторы конструкторов классов будут вызываться, когда будет создан конкретный подкласс
Две причины для этого:
1) Абстрактные классы имеют constructors
, и эти конструкторы всегда вызывается, когда создается конкретный подкласс. Мы знаем, что когда мы собираемся создать экземпляр класса, мы всегда используем конструктор этого класса. Теперь каждый конструктор вызывает конструктор своего суперкласса с неявным вызовом super()
.
2) Мы знаем, что конструктор также используется для инициализации полей класса. Мы также знаем, что абстрактные классы могут содержать поля, а иногда они должны быть инициализированы каким-то образом с помощью конструктора.
Поскольку другой класс может расширять его, а дочернему классу необходимо вызвать конструктор суперкласса.
Поскольку абстрактные классы имеют состояние (поля), и что-то вроде этого нужно как-то инициализировать.
Я полагаю, что корень этого вопроса заключается в том, что люди считают, что вызов конструктора создает объект. Это не относится к делу. Java нигде не утверждает, что вызов конструктора создает объект. Он просто делает то, что мы хотим, чтобы конструктор выполнял, например, инициализацию некоторых полей. Таким образом, вызываемый абстрактный конструктор классов не означает, что его объект создан.
Реализация мудрого вы часто увидите внутри оператора super() в конструкторах подклассов, что-то вроде:
public class A extends AbstractB{
public A(...){
super(String constructorArgForB, ...);
...
}
}