static
блоки и декларации выполнены в порядке их кодирования. Это означает, что во время выполнения статического блока поле num
еще не определено.
Простое исправление перемещает декларацию выше блок.
Java Language Specification Section 8.3.2.3 (среди прочего) говорит, что переменная может присваивается значение перед тем объявляется, но значение переменной не может быть доступ перед переменная объявлена , если его имя не полностью квалифицированный, так это составляет:
public class Example {
static{
num = 3; // assignment OK without qualifying the name
System.out.print(Example.num); // name must be qualified to access value
}
public static int num;
}
еще более интересным является то, что если переменная доступна, прежде чем был объявлен Его по умолчанию значение используется, и далее инициализацию по декларации все еще происходит, так что этот код:
public class Example {
static{
System.out.println(Example.num); // uses default value
num = 3; // assignment OK
System.out.println(Example.num); // assigned value (3) is visible
}
public static int num = 1; // initialization to 1 occurs
static{
System.out.print(Example.num); // initialized value (1) is visible
}
}
Производит этот вывод:
0
3
1
Wow!
Поместить 'public static int num;' над блоком (не может ссылаться на поле до его определения). Я не знаю, если это опечатка, но вы забыли написать 'int'. – Maroun
- 1 для вашего кода не компилируется, но вы требуете ошибки во время выполнения и не указываете, какой из них. –
Всегда копировать/вставлять ошибку и вывод исключений. –