我正在学习Java,并且我知道您不能将内部范围内声明的变量命名为与外部范围内声明的变量相同的名称,如下所示
public class Practice { public static void main(String[] args){ int x = 10; if (x == 10){ int x = 10; } } }
但是,我发现以下行为不合法
public class Practice { int x = 10; public static void main(String[] args){ int x = 10; if (x == 10) { } } }
这不是两次声明的变量吗?
不它不是。因为它们都在不同的范围内。函数x外部main具有 类级别范围, 而 函数x内部main具有 方法/函数级别范围 。
x
main
具有不同作用域的两个变量具有相同的名称是合法的。
请务必阅读第6.3节。JLS 声明的范围。以下是该节中的一些陈述。
声明的范围是程序的区域,在该区域中可以使用简单的名称引用声明所声明的实体(如果可见)(第6.4.1节)。 当且仅当声明的范围包括该点时,声明才在程序的特定点处。 块中的局部变量声明的范围(第14.4节)是该声明在其中出现的其余部分,从其自身的初始化程序开始,并在局部变量声明语句的右侧包括其他任何声明符。
声明的范围是程序的区域,在该区域中可以使用简单的名称引用声明所声明的实体(如果可见)(第6.4.1节)。
当且仅当声明的范围包括该点时,声明才在程序的特定点处。
块中的局部变量声明的范围(第14.4节)是该声明在其中出现的其余部分,从其自身的初始化程序开始,并在局部变量声明语句的右侧包括其他任何声明符。
有很多与范围相关的概念,例如 阴影 ,请阅读§6.4。遮蔽和遮盖。
JLS是学习Java允许和禁止的最佳场所。 随意在那里阅读章节。