为什么在java中方法外的变量可以有重复的变量名?

1 java

我正在学习 Java,我知道您不能将内部作用域中声明的变量命名为与外部作用域中声明的变量相同的名称,如下所示

public class Practice {
    public static void main(String[] args){
        int x = 10;
        if (x == 10){
            int x = 10;
        }           
    }   
}
Run Code Online (Sandbox Code Playgroud)

但是,我注意到以下内容并不违法

public class Practice {
    int x = 10;
    public static void main(String[] args){
        int x = 10;
        if (x == 10) {
        }           
    }   
}
Run Code Online (Sandbox Code Playgroud)

这不是声明了两次的变量吗?

hag*_*wal 5

\n

这不是声明了两次的变量吗?

\n
\n\n

不它不是。因为两者属于不同的范围。x函数外部main具有类级别范围,而x内部main具有方法/函数级别范围

\n\n

不同作用域中的 2 个变量具有相同的名称是合法的。

\n\n

请务必阅读\xc2\xa76.3。JLS声明的范围。以下是该部分的一些声明。

\n\n
\n

声明的范围是程序的区域,在该区域中,可以使用简单名称来引用由声明声明的实体,前提是它是可见的 (\xc2\xa76.4.1)。

\n\n

当且仅当声明的范围包括该点时,才称该声明位于程序中特定点的范围内。

\n\n

块 (\xc2\xa714.4) 中局部变量声明的作用域是该声明出现的块的其余部分,从其自己的初始值设定项开始,并包括右侧的任何其他声明符。局部变量声明语句。

\n
\n\n

有很多与范围相关的概念,例如shadowing,所以请阅读\xc2\xa76.4。阴影和模糊

\n\n

JLS 是了解 Java 允许什么和不允许什么的最佳场所。请随意阅读那里的章节。

\n