Статический блок - инициализируется при загрузке класса. Запускается только ОДИН РАЗ.
Нестатический блок - инициализируется при каждом новом создании экземпляпа класса в порядке появления. Запускается после того как конструтор выполнит super(). Если конструктор не выполняется, то и БЛОК НЕ ЗАПУСКАЕТСЯ.
В этом примере первым будет проинициализировано поле instance, а уже затем - BASE. Поэтому в момент вызова конструктора Tasks() полеBASE ещё содержит 0.
Поле DELTA является переменной-константой, поэтому компилятор сразу подставляет в выражение вместо DELTA его значение.
В итоге получаем: x = 0 + 5;
Нестатический блок - инициализируется при каждом новом создании экземпляпа класса в порядке появления. Запускается после того как конструтор выполнит super(). Если конструктор не выполняется, то и БЛОК НЕ ЗАПУСКАЕТСЯ.
abstract class Animal {
static {
System.out.println("Inside Animal");
}
}
class Cat extends Animal {
static {
System.out.println("Inside Cat");
}
}
class Dog extends Animal {
static {
System.out.println("Inside Dog");
}
}
public class Main {
public static void main(String[] args){
Animal cat = new Cat();
Animal dog = new Dog();
}
}
public class Tasks {
public static Tasks instance = new Tasks();
private static final int DELTA = 5;
private static int BASE = 7;
private int x;
public Tasks() {
x = BASE + DELTA;
}
public static int getBASE() {
return BASE;
}
public static void main(String[] args) {
System.out.println(Tasks.instance.x);
}
}
Пояснение: Инициализация статических полей осуществляется в том порядке, в котором они записаны.В этом примере первым будет проинициализировано поле instance, а уже затем - BASE. Поэтому в момент вызова конструктора Tasks() полеBASE ещё содержит 0.
Поле DELTA является переменной-константой, поэтому компилятор сразу подставляет в выражение вместо DELTA его значение.
В итоге получаем: x = 0 + 5;
Комментариев нет:
Отправить комментарий