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
,但仍然只要求解释我先前的疑问@马蒂扬皮特斯