初始化程序而不是赋值语句

时间:2018-03-07 01:49:58

标签: java

我在维基百科上阅读了关于Java中的final关键字(https://en.wikipedia.org/wiki/Final_(Java)#Final_variables),并且对第一句话感到有些困惑。它说:

  

最终变量只能通过初始值设定项或赋值语句初始化一次。

什么是"初始化程序"在这种背景下?我用谷歌搜索并了解了一个"初始化程序块"这是在构造函数之前执行的,但我不认为这是指的是什么,因为初始化程序块仍然可以使用赋值语句完成赋值。什么是"初始化器"哪个可以完成与赋值语句相同的工作?

3 个答案:

答案 0 :(得分:4)

维基百科段落的措辞令人难以置信。您可以初始化最终变量

  • 当你申报时,
  • 在声明它之后的初始化块中,在任何方法或构造函数之外,或
  • 在构造函数中。

您必须只选择其中一个地方。您无法初始化最终变量两次。

答案 1 :(得分:3)

关键词是一次。你可以做到

final int i = 1;

final int i;
{
    i = 1;
}

哪个是初始化块;是的 - 它将被复制(就像第一个例子一样)到每个构造函数中(如果没有显式提供,则包括默认值)。

答案 2 :(得分:-1)

初始化程序不是指初始化程序块。它指的是一个带有初始化表达式的字段声明,如JLS here中所定义。例如,

class Example {
    final Foo theField = new Foo();
}

theField将是一个具有初始化程序而非

的字段
class Example {
    final Foo theField;
    public Example(Foo foo) {
        this.theField = foo; // a normal assignment
    }
}

初始值设定项的存在会影响字段是否可以被视为constant variableconstant expression类型。