【发布时间】:2019-10-12 06:13:43
【问题描述】:
当我尝试编译以下类时
class C1 {
Integer v1 = v1;
}
我收到Illegal Self Reference 错误。现在考虑下面的另一个类。
class C2 {
Integer v1;
{
v1 = v1;
}
}
然后编译。这两个类有什么区别,为什么一个编译一个不编译。
更新:
如果v1 还没有在C1 类中可用,那么为什么下面的类也可以工作?
class C3 {
Integer v1 = v1 = 1;
}
在上面的C3 类中,v1 可用于要评估的表达式v1 = 1,但它在C1 中的工作方式不同。你能解释一下吗?
【问题讨论】:
-
区别是声明和声明+定义。
-
Integer v1 = v1的情况下,变量v1尚不存在,因此未定义 RHS。在您的第二种情况下,v1已经定义。 -
但是,
Integer v1 = v1 = 1;有效。如果这样的语法有效,那么这是否意味着v1在 LHS 后就准备好了? @蒂姆·比格莱森 -
@AmrishKumar 之所以有效,是因为赋值是右关联的,所以
v1在自赋值时有一个值。 -
@AmrishKumar 在
C1中有一个没有初始化的成员声明,它得到一个默认值null,所以静态块中的赋值是合法的。