首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类作用域变量与方法作用域变量

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

Stack Overflow用户
提问于 2013-10-20 02:33:45
回答 3查看 5.3K关注 0票数 1

我知道变量作用域被块{的开始和块}的结束所包围。如果在块中声明了相同的变量,则会发生编译错误Variable already defined。但是看看下面的例子。

代码语言:javascript
复制
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

为什么类作用域变量的重声明不会生成错误,但是方法作用域变量重声明会生成错误?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-20 02:43:03

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

代码语言:javascript
复制
int x = this.x
票数 2
EN

Stack Overflow用户

发布于 2013-10-20 02:47:53

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

票数 2
EN

Stack Overflow用户

发布于 2016-02-19 18:21:58

下面是java作用域的一个很好的例子(来自OCA 7)。在这里,z(类变量)是在方法doStuff2中初始化的。类变量可以在方法内初始化,但是如果在方法中重新声明相同的变量,则在堆栈上而不是堆上创建一个新的局部变量。

代码语言:javascript
复制
            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;
            }
            }

产出:

代码语言:javascript
复制
6 
5 
6 
4 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19473301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档