我声明了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
}
}
答案 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方法创建一个局部变量。该变量的范围从其声明开始,并在块的末尾结束(与所有局部变量一样)。因此,下一条语句使用局部变量,而不是实例变量。
方法返回后,本地变量将不再保存值。实例变量将不会被更改。
提示:将语句视为从其自身位置“向上”查找每个变量。如果他们无法在自己的方法内找到变量,则可以朝任何方向看“玻璃盒子”之外。
对于实例变量和局部变量使用相同的名称几乎总是一个错误。但这不是语法错误,因此编译器不会警告您。