为什么我可以在Java中成功在main()中再次声明一个静态字段?

时间:2019-04-10 06:35:47

标签: java static field

我声明了private static double fd,然后在main()中再次声明了double fd。为什么我可以编译并成功运行它?

    public class HelloWorld {
    private static double fd = 1.0;

    public static void main(String[] args){
        System.out.println(fd); //1.0
        double fd = 2.0;
        System.out.println(fd); //2.0


    }
}

3 个答案:

答案 0 :(得分:1)

在JLS Scope of a Declaration部分中:

  

声明的范围是程序所在的区域   声明所声明的实体可以使用   简单名称,前提是它没有阴影。

在JLS Shadowing部分中:

  

某些声明可能在一部分范围内被另一个声明遮盖   具有相同名称的声明,在这种情况下,不能使用简单名称   用来引用声明的实体。

这意味着您不能使用简单名称(df)来引用类级别df变量,因为它被本地df变量所遮盖。但是仍然有两个变量,您可以将静态变量与类名一起使用:

public static void main(String[] args){
    System.out.println(fd); //1.0

    double fd = 2.0;

    System.out.println(fd); //2.0
    System.out.println(HelloWorld.fd);
}

答案 1 :(得分:0)

变量 fd 是函数作用域的,就像这样,编译器首先检查距离它最近的作用域,然后如果没有找到该作用域,则尝试检查全局作用域,如果发现了某些东西在本地范围内,它将打印该内容,否则将继续检查其他范围。

答案 2 :(得分:0)

这不是语法错误(尽管可能会导致逻辑错误,错误)。编译器将编译此代码而不会产生投诉。 double fd的第二个声明为main方法创建一个局部变量。该变量的范围从其声明开始,并在块的末尾结束(与所有局部变量一样)。因此,下一条语句使用局部变量,而不是实例变量。

方法返回后,本地变量将不再保存值。实例变量将不会被更改。

提示:将语句视为从其自身位置“向上”查找每个变量。如果他们无法在自己的方法内找到变量,则可以朝任何方向看“玻璃盒子”之外。

对于实例变量和局部变量使用相同的名称几乎总是一个错误。但这不是语法错误,因此编译器不会警告您。