Какая разница в поведении этого кода?
У меня есть следующий код:
public class Application extends ApplicationManager{
public static void main(String[] args) {
ProcessUtility.enableProcessUtility();
new Application().start();
}
}
и код класса ApplicationManager:
public class ApplicationManager {
public ApplicationManager() {
String configPath = "file:home" + File.separator + "log4j.xml";
System.setProperty("log4j.configuration", configPath);
logger = Logger.getLogger(ApplicationManager.class);
}
protected void start() {
logger.info("*** Starting ApplicationManager ***");
}
когда я запускаю класс приложения, будет вызван метод start родительского класса, может ли он быть вызван без вызова родительского конструктора по умолчанию?
Мой второй вопрос - приведенный выше код, отличный от этого кода:
public class Application extends ApplicationManager{
public static void main(String[] args) {
new Application().start();
}
@Override
protected void start() {
ProcessUtility.enableProcessUtility();
super.start();
}
}
и класс ApplicationManager, как указано выше.
это код статического метода:
public static void enableProcessUtility() {
isCommon = false;
}
заранее спасибо.
2 ответа
Вызов нестатического метода (ваш start
метод) требует создания экземпляра класса, который содержит метод (или подкласс этого класса). Создание экземпляра класса требует вызова конструкторов класса и всех его классов-предков. Поэтому вы не можете избежать выполнения родительского конструктора по умолчанию.
Что касается второго вопроса, переезд ProcessUtility.enableProcessUtility()
к методу запуска подкласса означает, что он будет выполняться каждый раз, когда вы вызываете start
метод.
Тем не менее, в вашем примере ваш главный создает только один экземпляр Application
и только звонки start
один раз для этого случая. Следовательно ProcessUtility.enableProcessUtility()
будет выполняться только один раз в обоих фрагментах, и поведение будет идентичным.
РЕДАКТИРОВАТЬ: Другое различие между двумя фрагментами в том, что первый вызов фрагмента ProcessUtility.enableProcessUtility()
перед созданием Application
экземпляр, в то время как второй фрагмент сначала создает экземпляр, а затем вызывает ProcessUtility.enableProcessUtility()
изнутри start
подкласса. Если на поведение конструкторов (подкласса или суперкласса) влияет вызов ProcessUtility.enableProcessUtility()
два фрагмента могут давать разные результаты.
Ответ на ваш первый вопрос здесь /questions/31571006/zachem-vyizyivat-super-v-konstruktore/31571039#31571039
Что касается вашего второго вопроса, супер-конструктор будет вызван перед вызовом ProcessUtility во втором примере, где в первом примере вызов ProcessUtility будет первым.