Некоторые могут найти его похожим на вопрос SO Завершают ли переменные Java Final значения по умолчанию?, но этот ответ не полностью решает это, так как этот вопрос не прямо распечатайте значение x внутри блока инициализатора экземпляра.
Проблема возникает, когда я пытаюсь распечатать x непосредственно внутри блока инициализатора экземпляра, присвоив значение x до конца блока:
Случай 1
class HelloWorld {
final int x;
{
System.out.println(x);
x = 7;
System.out.println(x);
}
HelloWorld() {
System.out.println("hi");
}
public static void main(String[] args) {
HelloWorld t = new HelloWorld();
}
}
Это дает ошибку времени компиляции, указывающую, что переменная x не была инициализирована.
$ javac HelloWorld.java
HelloWorld.java:6: error: variable x might not have been initialized
System.out.println(x);
^
1 error
Случай 2
Вместо прямой печати я вызываю функцию для печати:
class HelloWorld {
final int x;
{
printX();
x = 7;
printX();
}
HelloWorld() {
System.out.println("hi");
}
void printX() {
System.out.println(x);
}
public static void main(String[] args) {
HelloWorld t = new HelloWorld();
}
}
Это правильно компилируется и дает результат
0
7
hi
Какова концептуальная разница между двумя случаями?