Java构造函数中用A.this为final字段赋值报错,this却正常的原因
为什么构造器中用
A.this.a给final字段赋值报错,this.a却可以? 先看两组代码示例:
正常编译运行的代码:
class A { final int a; A () { this.a = 1; // 无编译错误 } }
编译报错的代码:
class A { final int a; A () { A.this.a = 1; // 错误:java: cannot assign a value to final variable a } }
报错缘由
这是Java编译器对final字段初始化的语法判定规则导致的:
- 在构造器中使用
this.a赋值时,编译器会明确识别这是构造阶段对final字段的初始化操作,符合final字段“在实例构造完成前必须完成唯一一次赋值”的规则,因此允许执行。 A.this原本是为内部类设计的语法,用于明确指向外部类的实例。在顶级类(非内部类)的构造器中使用A.this.a时,编译器会将其语义判定为访问一个已经完成初始化的实例字段,此时对final字段赋值就会被视为“修改已初始化的final变量”,违反了final字段不可修改的规则,因此抛出编译错误。
简单来说,编译器对this和A.this的语义解析逻辑不同:前者在构造器语境下会关联到“初始化动作”,后者则被判定为“对已存在实例的字段修改”,哪怕两者指向的是同一个对象。
内容的提问来源于stack exchange,提问作者Logeshkumar S.
相关产品推荐
相关产品推荐

