1

考虑以下代码:

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

显然,当我们尝试初始化一个未声明的变量时,它不会编译。

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

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

使声明之前的初始化有效的初始化块的这个“特征”是什么?

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

4

1 回答 1

2

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

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

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

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

例如,您的代码相当于

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

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

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

于 2018-12-27T11:29:38.827 回答