为什么编译器不会生成重复错误?

Rui*_*zhi 1 java class

为什么下面的代码可以编译成功?

  • 第二个语句int a = 2只是在范围内定义int a = 2,为什么它可以成功编译?

    class Test {
        int a = 1;         // variable a,
        { 
            int a = 2;     //duplicate variable
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            System.out.println(new Test().a);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

Era*_*ran 7

int a = 2;是实例初始化程序块的局部变量.因此,它Test作为局部变量添加到类的每个构造函数的主体中.允许局部变量与实例变量具有相同的名称(例如,这允许您具有其参数名称与相应实例变量的名称相同的构造函数).它们只是隐藏同名的实例变量(this.如果要引用实例变量,则强制您使用名称限定).

class Test {
    int a = 1;        
    { 
        int a = 2; 
    }
}
Run Code Online (Sandbox Code Playgroud)

相当于:

class Test {
    int a = 1;
    public Test ()
    { 
        int a = 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这个片段没有任何意义(因为我们从不使用局部变量的值a),但是a在下面的示例中有2个变量命名(一个是局部变量,另一个是实例变量)是有意义的:

class Test {
    int a = 1;
    public Test (int a)
    { 
        this.a = a;
    }
}
Run Code Online (Sandbox Code Playgroud)