java - Java 中的非法自引用是什么?

标签 java variable-declaration

当我尝试编译以下类时

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/

相关文章:

c - 变量声明和数据类型

java - 在 RecyclerView 中滚动时如何使relativelayout消失

javascript - 需要根据条件隐藏选定的元素

C 指向数组/指针数组的指针消歧

java - 如何检查正则表达式以正则表达式开头和结尾

c - C 中的变量声明

c++ - 原始数据类型在循环内分配了多少次?

java - 简单日期格式 24 小时

java - Hadoop 多输出

java - CVS日志日期格式配置