Telegram Group & Telegram Channel
Вопрос с собеседования: Статический блок и порядок инициализации

🔍 Условие:

Что выведет следующий код и почему?


public class InitializationPuzzle {
static {
System.out.println("Static block 1");
}

public static void main(String[] args) {
Child.doSomething();
}
}

class Parent {
static {
System.out.println("Parent static block");
}
}

class Child extends Parent {
static {
System.out.println("Child static block");
}

static void doSomething() {
System.out.println("Child method");
}
}


Вопрос:
Какой будет порядок вывода? Почему результат может удивить даже опытных Java-разработчиков?


🔍 Разбор:

Что происходит по шагам:

1️⃣ При запуске программы сначала загружается класс `InitializationPuzzle`. Его статический блок выполняется сразу:


Static block 1


2️⃣ Далее вызывается Child.doSomething(). Теперь происходит инициализация класса `Child`. В Java при инициализации класса-потомка сначала загружается родительский класс, если он ещё не был загружен.

- Инициализация Parent:

Parent static block


- Инициализация Child:

Child static block


3️⃣ Наконец выполняется метод doSomething():

Child method


---

Ожидаемый полный вывод:


Static block 1
Parent static block
Child static block
Child method


💥 Подвох:

• Многие разработчики думают, что раз doSomething() просто статический метод, может выполниться только он.
• Однако Java гарантирует, что перед выполнением любого статического метода класс будет полностью инициализирован.
• Также важно помнить, что при инициализации класса наследника сначала выполняются статические блоки родителя.

🛡️ Лайфхак:

Если вы хотите убедиться, что родительский класс не инициализируется при доступе к статическим полям/методам потомка, нужно использовать константы (static final), которые компилируются напрямую в байткод и не требуют загрузки класса.

Вывод:

• Java строго инициализирует классы в порядке наследования перед вызовом любых статических методов.
• Даже вызов одного «безопасного» статического метода потомка затянет за собой загрузку родителя.
• Такие задачи хорошо проверяют понимание механизма класслоадеров и инициализации классов в JVM.

💡 Бонус-вопрос:
Что изменится, если вы замените doSomething() на чтение static final поля в Child? Будет ли тогда инициализирован Parent?

@javatg



tg-me.com/javatg/1825
Create:
Last Update:

Вопрос с собеседования: Статический блок и порядок инициализации

🔍 Условие:

Что выведет следующий код и почему?


public class InitializationPuzzle {
static {
System.out.println("Static block 1");
}

public static void main(String[] args) {
Child.doSomething();
}
}

class Parent {
static {
System.out.println("Parent static block");
}
}

class Child extends Parent {
static {
System.out.println("Child static block");
}

static void doSomething() {
System.out.println("Child method");
}
}


Вопрос:
Какой будет порядок вывода? Почему результат может удивить даже опытных Java-разработчиков?


🔍 Разбор:

Что происходит по шагам:

1️⃣ При запуске программы сначала загружается класс `InitializationPuzzle`. Его статический блок выполняется сразу:


Static block 1


2️⃣ Далее вызывается Child.doSomething(). Теперь происходит инициализация класса `Child`. В Java при инициализации класса-потомка сначала загружается родительский класс, если он ещё не был загружен.

- Инициализация Parent:

Parent static block


- Инициализация Child:

Child static block


3️⃣ Наконец выполняется метод doSomething():

Child method


---

Ожидаемый полный вывод:


Static block 1
Parent static block
Child static block
Child method


💥 Подвох:

• Многие разработчики думают, что раз doSomething() просто статический метод, может выполниться только он.
• Однако Java гарантирует, что перед выполнением любого статического метода класс будет полностью инициализирован.
• Также важно помнить, что при инициализации класса наследника сначала выполняются статические блоки родителя.

🛡️ Лайфхак:

Если вы хотите убедиться, что родительский класс не инициализируется при доступе к статическим полям/методам потомка, нужно использовать константы (static final), которые компилируются напрямую в байткод и не требуют загрузки класса.

Вывод:

• Java строго инициализирует классы в порядке наследования перед вызовом любых статических методов.
• Даже вызов одного «безопасного» статического метода потомка затянет за собой загрузку родителя.
• Такие задачи хорошо проверяют понимание механизма класслоадеров и инициализации классов в JVM.

💡 Бонус-вопрос:
Что изменится, если вы замените doSomething() на чтение static final поля в Child? Будет ли тогда инициализирован Parent?

@javatg

BY Java


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/javatg/1825

View MORE
Open in Telegram


Java Telegram | DID YOU KNOW?

Date: |

Launched in 2013, Telegram allows users to broadcast messages to a following via “channels”, or create public and private groups that are simple for others to access. Users can also send and receive large data files, including text and zip files, directly via the app.The platform said it has more than 500m active users, and topped 1bn downloads in August, according to data from SensorTower.

What is Telegram Possible Future Strategies?

Cryptoassets enthusiasts use this application for their trade activities, and they may make donations for this cause.If somehow Telegram do run out of money to sustain themselves they will probably introduce some features that will not hinder the rudimentary principle of Telegram but provide users with enhanced and enriched experience. This could be similar to features where characters can be customized in a game which directly do not affect the in-game strategies but add to the experience.

Java from tw


Telegram Java
FROM USA