如果特定范围(例如内部类或方法定义)中的类型声明(例如成员变量或参数名称)与封闭范围中的另一个声明具有相同的名称,则该声明会隐藏封闭范围中的声明。您不能仅通过名称来引用影子声明。以下示例 ShadowTest 演示了这一点:
public class ShadowTest {
public int x = 0;
class FirstLevel {
public int x = 1;
void methodInFirstLevel(int x) {
System.out.println("x = " + x);
System.out.println("this.x = " + this.x);
System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
}
}
public static void main(String... args) {
ShadowTest st = new ShadowTest();
ShadowTest.FirstLevel fl = st.new FirstLevel();
fl.methodInFirstLevel(23);
}
}
以下是此示例的输出:
x = 23
this.x = 1
ShadowTest.this.x = 0
本例定义了三个名为x的变量:ShadowTest类的成员变量、内部类FirstLevel的成员变量、方法methodInFirstLevel中的参数。定义为方法methodInFirstLevel 的参数的变量 x 隐藏了内部类FirstLevel 的变量 x。因此,当您在方法methodInFirstLevel 中使用变量 x 时,它指的是方法参数。要引用内部类 FirstLevel 的成员变量,使用关键字 this 来表示封闭范围:
System.out.println("this.x = " + this.x);
引用通过它们所属的类名包围更大范围的成员变量。例如,以下语句从方法 methodInFirstLevel 访问类 ShadowTest 的成员变量:
System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);