четверг, 14 апреля 2016 г.

Когда срабатывают static в java


class A {
    private static int v = func();
    private static int func() {
        System.out.print("A");
        return 0;
    }
}

class B {
    private static int v = func();
    public static int func() {
        System.out.print("B");
        return 0;
    }
}

class C {
    private static int v = func();
    public static int func() {
        System.out.print("C");
        return 0;
    }
}

class Question {
    public static void main(String[] args) {
        B b;
        C.func();
        b = new B();
        System.out.println();
    }
}

Вывод будет: CCB

Почему так? Из спецификации:
Класс Т инициализируется в одном из следующий 5 случаев:
1. Создается объект класса Т.
2. Вызывется статичный метод класса Т.
3. Статичной переменной класса Т присваивается значение (вне класса).
4. Статичная (не константная) переменная класса Т используется.
5. Т - внешний класс и внутри него выполняется конструкция assert.

Таким образом первое упоминание класса В не запускает инициализацию класса.

пример взят из http://www.quizful.net/

Комментариев нет:

Отправить комментарий