Блоки инициализации

Статический блок - инициализируется при загрузке класса. Запускается только ОДИН РАЗ.
Нестатический блок - инициализируется при каждом новом создании экземпляпа класса в порядке появления. Запускается после того как конструтор выполнит 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;

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

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