我知道变量范围由块{
的开头和块}
的结尾括起来。如果在块中声明了相同的变量,则会发生编译错误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
无法重新声明。
为什么重新声明类范围变量不会产生错误,但方法范围变量重新声明会产生错误?
答案 0 :(得分:2)
这是因为int x=0
不是变量而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们为实例字段使用this
前缀或为类字段使用类名。例如。
int x = this.x
答案 1 :(得分:2)
因为这就是Java的设计方式。语言设计者可以很容易地做到这一点,因此不可能对局部变量和实例变量使用相同的名称。他们只是选择不去。
答案 2 :(得分:0)
这是java范围的一个很好的例子(来自OCA java SE-7)。这里z(类变量)在方法doStuff2中初始化。类变量可以在方法内初始化,但如果在方法内重新声明相同的变量,则在堆栈而不是堆上创建新的局部变量。
public class ScopeTest
{
int z;
public static void main(String[] args){
ScopeTest myScope = new ScopeTest();
int z = 6;
System.out.println(z);
myScope.doStuff();
System.out.println(z);
System.out.println(myScope.z);
}
void doStuff() {
int z = 5;
doStuff2();
System.out.println(z);
}
void doStuff2()
{
z = 4;
}
}
输出:
6
5
6
4