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

时间:2018-12-27 11:21:10

标签: java initializer variable-initialization initialization-block

考虑以下代码:

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

很显然,当我们尝试初始化未声明的变量时,它将无法编译。

但是,将该语句包含在初始化块中可以使其成功编译:

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

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

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

1 个答案:

答案 0 :(得分:2)

重点是id = 2;是一条语句,可以将其放在初始化程序块中。

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

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

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

例如,您的代码等同于

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

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

只要习惯了总是在类的开头声明实例变量(如果这样会使您感到困惑),就可以习惯了。