为什么将变量初始化封装到初始化块中允许在声明之前进行初始化?
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 开头声明实例变量的约定,如果这让您感到困惑。
考虑以下代码:
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 开头声明实例变量的约定,如果这让您感到困惑。