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

Рейтинг: -4Ответов: 2Опубликовано: 24.01.2015

Почему выполнится без ошибок?

public class Test{

static{
   int x = 5;
}

static int x = 5;

}

Ответы

▲ 4

Здесь нет кода, который мог бы выбросить исключение. Видимо, вас интересует, почему это компилируется.

Все просто: у вас статическая переменная Test.x и один статический инициализатор с локальной переменной x, которая в силу свой локальности "перекрывает" переменную Test.x.

Вот аналогичный случай:

public class Test {
    static int x;

    public static void main(String[] args) {
        x = 5;  
        System.out.println("x = " + x); // Используется Test.x
        int x;
        x = 10;  
        System.out.println("x = " + x); // Используется локальная переменная x
        System.out.println("Test.x = " + Test.x); // Используется Test.x
    }
}

Вывод:

x = 5 
x = 10
Test.x = 5
▲ 0

А ещё можно так написать, присвоение до объявления.

class Main{
   static {
        x = 5;
   }
   static int x;
}