1 回答
TA贡献1843条经验 获得超7个赞
假设以下类
public class MyClass {
int a = b;
int b = 10;
}
JLS 8.3.3。在你的情况下:
使用实例变量,其声明在使用后以文本形式出现有时会受到限制
- 使用是 C 的实例变量初始化程序或 C 的实例初始化程序中的简单名称
现在,使用该成员this允许您访问已使用默认值 ( a = 0, b = 0) 声明但尚未完全初始化的实例。如果您检查以下结果,这是可见的:
public class MyClass {
int a = this.b;
int b = 10;
}
你不会得到预期的价值:
new MyClass().a //0
new MyClass().b //10
我无法解释为什么这是合法的,因为这永远不会给出正确的值。我们可以找到一些关于为什么存在限制的解释:
上述限制旨在在编译时捕获循环或其他格式错误的初始化。
但是为什么允许this工作......
知道在实例初始化期间,会发生以下操作:
会员声明
按顺序执行块和字段初始化
构造函数执行
给出一些奇怪的行为:
public class MyClass {
{
b = 10;
}
int a = this.b;
int b = 5;
{
b = 15;
}
public static void main(String[] args) {
MyClass m = new MyClass();
System.out.println(m.a); //10
System.out.println(m.b); //15
}
}
我会限制构造函数中的初始化。
添加回答
举报