当我尝试编译以下类时
class C1 {
Integer v1 = v1;
}
我收到非法自引用
错误。现在考虑下面的另一个类。
class C2 {
Integer v1;
{
v1 = v1;
}
}
并且它可以编译。这两个类之间有什么区别,为什么一个可以编译而一个不能。
更新:
如果 v1
尚未在类 C1
中可用,那么为什么下面的类也可以工作?
class C3 {
Integer v1 = v1 = 1;
}
在上面的 C3
类中,v1
可用于计算表达式 v1 = 1
,但它在 C1
中的工作方式不同。你能解释一下吗?
最佳答案
v1
在您定义它之后开始存在,因此当您尝试将值保存到自身时,它还不存在:
class C1 {
Integer v1 = v1;
//declaring-^ ^-doesn't exist yet
}
这是等效代码:
public class SomeClass {
Integer v1;
//声明....^
public SomeClass() {
this.v1 = v1;
// ^-----^
// |
// both exist
}
}
在您的示例中,实例 block 代码在声明变量后执行,就像构造函数一样:
class C2 {
Integer v1;
{
v1 = v1; // instance block executed after variable declaration
}
}
更新问题的最后一部分在这里得到了很好的解释https://softwareengineering.stackexchange.com/questions/205079/what-is-the-difference-advantage-of-doing-double-assignment
并在用户@user207421的评论中回答(关于正确关联)
关于java - Java 中的非法自引用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58351392/