我知道变量作用域由块的开始和块{的结尾包围}。如果在块内声明了相同的变量,Variable already defined则会发生编译错误。但是,请看以下示例。
{
}
Variable already defined
public class Test{ int x=0;// Class scope variable public void m(){ int x=9; //redeclaration of x is valid within the scope of same x. if(true){ int x=7; // but this redeclaration generates a compile time error. } }
在这里,x可以在方法中重新声明,尽管它已经在类中声明了。但是在if块中,x无法重新声明。
x
if
为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误?
这是因为int x=0不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们this在实例字段中使用前缀,在类字段中使用类名。例如
int x=0
this
int x = this.x