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

Java8变量作用域
EN

Stack Overflow用户
提问于 2018-07-18 04:16:09
回答 1查看 69关注 0票数 4

当我准备OCAJP考试时,我参加了模拟考试,我遇到了下面这个关于变量和变量范围的问题。

代码语言:javascript
复制
public class HelloWorld{
     static int x = 2;            
     public static void main(String []args){
        if(x>1)
        {
            x++;
            int x = 4;
        }
        System.out.println(x);
        final int x = 10;
     }
}

上面代码的输出是"3“。但是我不知道为什么输出是3。我可以理解if块中的"int x=4“将在IF块之外看到。但是"final int x= 10;“不应该抛出编译器的轨道,因为已经有x作为静态变量了吗?

EN

回答 1

Stack Overflow用户

发布于 2018-07-18 04:30:32

让我们按照代码顺序来处理这个问题。

代码语言:javascript
复制
static int x = 2;

这将声明一个初始化为2的名为x的静态类变量。

代码语言:javascript
复制
if(x>1)

这指的是静态类变量,因为x的其他声明还没有发生。

代码语言:javascript
复制
    x++;

这会将静态类变量x递增为3

代码语言:javascript
复制
    int x = 4;

这将声明一个与静态类变量x不同的新局部变量x,并将其初始化为4。这个新的局部变量隐藏了静态类变量。但是,它立即超出了作用域;它的作用域仅限于if块。它在声明之后和超出范围之前不会被引用。

代码语言:javascript
复制
System.out.println(x);

这将打印作用域中唯一的x,即静态类变量,即3。上面声明的局部x超出了作用域,不再隐藏静态类变量。

代码语言:javascript
复制
final int x = 10;

这将声明另一个新的局部变量x,该变量也不同于静态类变量x,也不同于先前在if块中声明的已超出作用域的x,并将其初始化为10。这个新的局部变量隐藏了静态类变量。但是,它也立即超出了作用域;它的作用域仅限于main方法块。它在声明之后和超出范围之前也不会被引用。

要点是:

  • 局部变量可以隐藏同名的类变量。但是,它只在自己的本地scope.
  • Variables中执行此操作(尚未声明)尚未隐藏类变量。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51389547

复制
相关文章

相似问题

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