Какая разница в поведении этого кода?

У меня есть следующий код:

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 будет первым.

Другие вопросы по тегам