为什么必须在构造函数完成之前初始化最终变量?
public class Ex
{
final int q;
}
Run Code Online (Sandbox Code Playgroud)
当我编译这段代码时,我得到这样的错误
错误:变量q可能尚未初始化
ass*_*ias 35
的官方理由是,它是由定义的Java语言规范8.3.1.2:
必须在声明它的类的每个构造函数的末尾明确赋值空白的最终实例变量 ; 否则会发生编译时错误.
空白最终是一个最终变量,其声明缺少初始化程序(即您描述的内容).
Ken*_*rey 10
一个final变量必须在声明或构造函数初始化.
如果在构造函数返回时尚未初始化它,则它可能永远不会被初始化,并且可能仍然是未初始化的变量.编译器无法证明它将被初始化,因此会抛出错误.
这个维基百科摘录解释得很好:
最终变量只能通过初始化程序或赋值语句初始化一次.它不需要在声明点初始化:这称为"空白最终"变量.必须在声明它的类的每个构造函数的末尾明确赋值类的空白最终实例变量; 类似地,必须在声明它的类的静态初始值设定项中明确赋值空白的最终静态变量:否则,在两种情况下都会发生编译时错误.(注意:如果变量是引用,这意味着变量不能重新绑定到引用另一个对象.但它引用的对象仍然是可变的,如果它最初是可变的.)
final应用于字段的关键字具有以下两种效果之一:
final HashMap<String,String> a,你将只能设置一次,你将无法再做this.a=new HashMap<String,String>();一次,但是没有什么能阻止你做this.a.put("a","b"),因为那不会修改引用,只有对象的内容.| 归档时间: |
|
| 查看次数: |
55013 次 |
| 最近记录: |