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

Java中的非法自引用是什么?,java,variable-declaration,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中的作用不同。

当我试图编译下面的类时

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
    }
}
在您的示例中,实例块代码在声明变量后执行,就像构造函数一样:

class C2 {
  Integer v1;
  {
    v1 = v1;  // instance block executed after variable declaration
  }
}
更新问题的最后一部分在这里得到了很好的解释


并在用户@user207421(关于右关联)的评论中回答

v1
在定义后开始存在,因此当您尝试将值保存到自身时,它还不存在:

class C1 {
    Integer v1 = v1;
//declaring-^     ^-doesn't exist yet
}
这是一个等效代码:

public class SomeClass {
    Integer v1;
//宣布……^

    public SomeClass() {
        this.v1 = v1;
//           ^-----^
//              |
//          both exist
    }
}
在您的示例中,实例块代码在声明变量后执行,就像构造函数一样:

class C2 {
  Integer v1;
  {
    v1 = v1;  // instance block executed after variable declaration
  }
}
更新问题的最后一部分在这里得到了很好的解释



在用户@user207421(关于右关联)的评论中回答

区别在于声明和声明+定义。在
整数v1=v1
的情况下,变量
v1
还不存在,因此没有定义RHS。在第二种情况下,
v1
已经定义。但是,
Integer v1=v1=1工作。如果这样的语法有效,那么是否意味着只要LHS一出现,
v1
就准备好了@提姆Biegeleisen@AmrishKumar这是因为赋值是右关联的,所以
v1
在自赋值时有一个值。@AmrishKumar在
C1
中有一个没有初始化的成员声明,它的默认值为
null
,因此,静态块中的赋值是合法的。区别在于声明和声明+定义。在
整数v1=v1
的情况下,变量
v1
还不存在,因此没有定义RHS。在第二种情况下,
v1
已经定义。但是,
Integer v1=v1=1工作。如果这样的语法有效,那么是否意味着只要LHS一出现,
v1
就准备好了@提姆Biegeleisen@AmrishKumar这是因为赋值是右关联的,所以
v1
在自赋值时有一个值。@AmrishKumar在
C1
中有一个没有初始化的成员声明,它的默认值为
null
,因此,静态块中的赋值是合法的。我认为这与
v1
的可用性无关,正如您在回答中所说的那样,
C3
是我的证据@达米安·拉斐尔Lattenero@AmrishKumar你的新例子又不同了
Integer v1
声明变量(编译时),并且在运行时
v1=1
作为一个表达式执行,其值被分配给
v1
。所以它实际上是
整数v1=(v1=1)。您给了
v1
一个值,因此它可供参考。@AmrishKumar但是,您不应该做的是在您的问题得到回答后移动目标柱。您的C3部分本质上是一个新问题。我将
C3
部分包括在内,以证明
v1
可以作为
C1
中RHS的变量。早些时候,我不得不向每一条关于这个问题的评论解释这一点。我看不出这会如何改变问题的原始动机。我在更新结束时引用了
C1
,但仍然只要求解释我先前的疑问@Martijnpieters我认为这与
v1
的可用性没有任何关系,正如您在回答中所说,
C3
是我的证据@达米安·拉斐尔Lattenero@AmrishKumar你的新例子又不同了
Integer v1
声明变量(编译时),并且在运行时
v1=1
作为一个表达式执行,其值被分配给
v1
。所以它实际上是
整数v1=(v1=1)。您给了
v1
一个值,因此它可供参考。@AmrishKumar但是,您不应该做的是在您的问题得到回答后移动目标柱。您的C3部分本质上是一个新问题。我将
C3
部分包括在内,以证明
v1
可以作为
C1
中RHS的变量。早些时候,我不得不向每一条关于这个问题的评论解释这一点。我看不出这会如何改变问题的原始动机。我在更新结束时引用了
C1
,但仍然只要求解释我先前的疑问@马蒂扬皮特斯