Место метода main() в порядке инициализации класса в Java

Я - новичок в Java. И сейчас меня очень занимает вопрос инициализации класса. Я наткнулся на такое объяснение с примером на странице https://ru.stackoverflow.com/a/847576/396180:

Порядок инициализации:

  1. Первым инициализируется статический блок инициализации класса
  2. Затем инициализируются блоки инициализации
  3. Затем вызывается метод public static void main(String[] args), который является точкой входа в приложение и в самом конце вызывается конструктор класса

Примечание.

  1. Метод, имя которого совпадает с конструктором не вызывается при инициализации.
  2. Метод, имя которого main() в моем коде, но который не является точкой входа, не вызывается при инициализации. Не является он точкой входа, потому как возвращает void и не имеет аргументов.
  3. Обычные статические методы не вызываются при инициализации.
  4. Обычные нестатические методы не вызываются при инициализации.

Пример кода:

public class InitClass {
    InitClass(){ // конструктор класса
    System.out.print(" Конструктор "); 
    }
    { // блок инициализации
     System.out.print(" 3 "); 
    } 
    void InitClass(){// имя метода совпадает с именем конструктора но возвращает void
    // метод не вызывается при инициализации
    System.out.print(" метод InitClass "); 
    }
    public static void main(String[] args) { 
    System.out.print(" 2 "); 
    new InitClass(); 
    } 
    public void main(){ //- это обычный метод с именем main
     // имя метода совпадает с именем точки входа, но не имеет аргументов
    // метод не вызывается при инициализации
    System.out.print(" метод main - не точка входа "); 
    }
    public static void method(){ // статический метод
    // метод не вызывается при инициализации
    System.out.print("статичные метод с именем  method()"); 
    }
    static { // статический блок инициализации
    System.out.print(" 1 "); 
    } 
}

/*
run:
 1  2  3  Конструктор BUILD SUCCESSFUL (total time: 0 seconds)
*/

Я не могу понять: почему, если метод

 public static void main(String[] args) { 
         System.out.print(" 2 "); 
         new InitClass();  }

вызывается после блока инициализации, мы видим " 2 " раньше " 3 " в блоке инициализации ? Спасибо!


Ответы (1 шт):

Автор решения: Roman C

НО и отчего же тогда при выполнении я вижу 1 2 3 Конструктор вместо 1 3 2 Конструктор ?)

то есть 2 вызывается раньше чем 3, потому что метод

public static void main(String[] args)

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

Более меннее адекватное понимание статической памяти можно почитать здесь.

→ Ссылка