类范围变量与方法范围变量

时间:2013-10-20 02:33:46

标签: java variables scope

我知道变量范围由块{的开头和块}的结尾括起来。如果在块中声明了相同的变量,则会发生编译错误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无法重新声明。

为什么重新声明类范围变量不会产生错误,但方法范围变量重新声明会产生错误?

3 个答案:

答案 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