为什么将变量初始化封装到初始化块中允许在声明之前进行初始化?

Why does encasing variable initialization into an initialization block allow initialization before declaration?

考虑以下代码:

class New {
    id = 2;
    int id = 7;
}

显然它不会编译,因为我们试图初始化一个未声明的变量。

然而,将语句封装到初始化块中,使其编译成功:

class New {
    { id = 2; }
    int id = 7;
}

这个 "feature" 的初始化块是什么,它使声明之前的初始化有效?

在问这个问题之前,我阅读了一些关于 SO 初始化块的帖子,但它们似乎主要解决了初始化顺序的问题(例如静态与非静态)。

关键是id = 2;是一个语句,可以放在初始化块中。

你的第一个代码不是因为声明顺序不合法,而是因为你不能使用代码块之外的语句。这个也失败了:

class New {      
    int id = 7;
    id = 2;
}

实例变量的声明可以出现在class的任何地方。与初始化程序块完全无关。

例如,您的代码等同于

class New {
    New() { id = 2; }
    int id = 7;
}

根据你的问题,这也是非法的,因为初始化发生在声明之前。

只要习惯总是在 class 开头声明实例变量的约定,如果这让您感到困惑。