пятница, 20 июня 2014 г.

Инициализация статических блоков. Хитрожопый пример.

Что будет выведено при выполнении данного кода?
class A {
    static {
        System.out.print("A");
    }
}
 
class B extends A {
    public static int b = 2;
 
    static {
        System.out.print("B");
    }
}
 
class C extends B {
    static {
        System.out.print("C");
        System.exit(0);
    }
}
 
public class StaticInitTest {
    public static void main(String[] args) {
        System.out.println(C.b);
    }
}
Ожидаемым ответом было ABC: C extends B, B extends A; значит, инициализируем статические блоки A, B, C, где и попадаем на System.exit(0).
Но это не так. Класс C не будет загружен вообще. Потому что:
 - не создавался объект класса С
 - не вызывались его статические методы
 - не было обращения к его статическим полям
А как же System.out.println(C.b)?
У класса С нет своих статических полей. Поле b принадлежит классу B, а не C, в этом и фокус. Класс B будет загружен, а к классу C (вопреки интуиции=)) обращения не было, его static блок выполнен не будет.
Правильный ответ - AB2.

P.S. Вопрос взят у Seregs12324 :: quizful.net

1 комментарий:

  1. містер Бенджамін Лі був ключовим партнером у нашому успіху та безцінним активом для зростання та майбутнього нашої компанії, містер Бенджамін та його позикова компанія інвестували у мій бізнес із позикою 1000000 доларів у розмірі 2 натомість, і це було дуже приємно працювати з ним, тому що я не знаю, що б я зробив без допомоги пана Бенджаміна та його позикової компанії, пана Бенджаміна контактна електронна адреса: 247officedept@gmail.com та whatsapp: + 1-989-394-3740

    ОтветитьУдалить