考虑以下代码:
class New {
id = 2;
int id = 7;
}
很显然,当我们尝试初始化未声明的变量时,它将无法编译。
但是,将该语句包含在初始化块中可以使其成功编译:
class New {
{ id = 2; }
int id = 7;
}
使声明前的初始化有效的初始化块的“特征”是什么?
在问这个问题之前,我读了几篇关于SO初始化块的文章,但它们似乎主要解决了初始化顺序上的问题(例如静态与非静态)。
答案 0 :(得分:2)
重点是id = 2;
是一条语句,可以将其放在初始化程序块中。
由于声明顺序,您的第一个代码不是非法的,但是因为您不能在代码块之外使用语句。这也失败了:
class New {
int id = 7;
id = 2;
}
实例变量的声明可以出现在类中的任何地方。与初始化程序块完全无关。
例如,您的代码等同于
class New {
New() { id = 2; }
int id = 7;
}
根据您的问题,这也是非法的,因为初始化发生在声明之前。
只要习惯了总是在类的开头声明实例变量(如果这样会使您感到困惑),就可以习惯了。