类作用域变量与方法作用域变量



我知道变量作用域由块{的开头和块}的结束所包围。如果在块中声明了相同的变量,则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无法重新声明。

为什么类作用域变量的重新声明不会生成错误

,而方法作用域变量的重新声明会生成错误?

这是因为int x=0不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和同名字段,我们使用this实例字段的前缀或类字段的类名。例如

int x = this.x

因为这就是Java的设计方式。 语言设计者可以很容易地做到这一点,这样就不可能对局部变量和实例变量使用相同的名称。 他们只是选择不这样做。

这是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 

相关内容

  • 没有找到相关文章

最新更新