Java8 变量作用域

标签 java variables scope

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

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 block 内的“int x=4”将在 IF block 外看到。但不应该是“final int x = 10;”因为已经有 x 作为静态变量,所以让编译器偏离轨道?

最佳答案

让我们按代码顺序来看。

static int x = 2;

这声明了一个名为 x 的静态类变量,它被初始化为 2

if(x>1)

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

    x++;

这会将静态类变量 x 增加到 3

    int x = 4;

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

System.out.println(x);

这会打印范围内唯一的x,静态类变量,即3。上面声明的局部 x 超出范围,不再隐藏静态类变量。

final int x = 10;

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

主要有以下几点:

  • 一个局部变量可以隐藏一个同名的类变量。但是,它只在自己的本地范围内这样做。
  • 尚未声明的变量还不影响类变量。

关于Java8 变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51389547/

相关文章:

variables - 为什么 'let' 引入的绑定(bind)范围有限?

function - 如何在调用者的上下文中调用脚本 block ?

java - Spring 安全oauth2 : get username in REST webservice

variables - 使用批量延迟扩展时路径中的特殊字符(感叹号!、胡萝卜 ^ 等)出现问题

ruby-on-rails - 从 Ruby on Rails 应用程序中的模型访问数据

variables - 电话号码最后一部分的变量名

javascript - 如何在 JavaScript 中将对象返回到不同的作用域?

java - 什么是 ArrayAdapter?

java - 是否有包含/不包含时间间隔结束的标准?

java - Spring Framework HttpComponentsClientHttpRequestFactory 线程安全吗?