Выполнение статического блока дочернего класса, полученного из абстрактного класса - PullRequest
0 голосов
/ 18 декабря 2018
public class Test15 {
    public static void main(String[] args) {
        System.out.println(B.x);
    }
}

abstract class A { 
    static int x=99;

    A() {
        System.out.println("A DC");
    }

    static {
        System.out.println("A SB");
    }
}

class B extends A {
    static {
        System.out.println("B Sb");
    }
}

Почему в указанной программе статический блок дочернего класса не выполняется?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

статический блок B будет выполняться только при инициализации класса B.Вызов feild x его суперкласса A не приведет к инициализации класса B.

Из спецификации Java:

12.4.1 Когда происходит инициализация

Класс T или интерфейсный тип T будут инициализированы непосредственно перед первым появлением любого изследующее:

• T - это класс, и создается экземпляр T.

• T - это класс, и вызывается статический метод, объявленный T.

• Aназначается статическое поле, объявленное T.

• Используется статическое поле, объявленное T, и поле не является константной переменной (§4.12.4).

• T является верхним уровнемкласс (§7.6) и оператор assert (§14.10), лексически вложенный в T (§8.1.3).

0 голосов
/ 18 декабря 2018

x - это переменная static класса A, поэтому даже если вы обращаетесь к ней через B.x, нет необходимости инициализировать класс B.Поэтому инициализатор класса B static не выполняется.

Вот соответствующая цитата JLS 12.4.1 :

Ссылка наСтатическое поле (§8.3.1.1) вызывает инициализацию только того класса или интерфейса, который фактически объявляет его, даже если на него можно ссылаться через имя подкласса, подынтерфейса или класса, который реализует интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...