内部类必须使用 'this' 关键字才能使用外部类方法或属性吗?



我正在阅读ArrayList的源代码,这个类有一个名为SubList的内部类。我正在查找内部类(SubList(的一个方法,并看到以下方法:

public E set(int index, E e) {
rangeCheck(index);
checkForComodification();
E oldValue = ArrayList.this.elementData(offset + index);
ArrayList.this.elementData[offset + index] = e;
return oldValue;
}

我看到的是第3&4使用this关键字来调用/使用ArrayList(外部类(方法/属性。我想知道是必须使用OuterClass.this还是elementData()就足够了?我在很久以前(一年多以前(运行了一个示例,并且能够在不使用this关键字的情况下从内部类调用外部类方法。

存在一个阴影问题,该问题可能导致意外行为和运行时错误。

如果特定作用域(如内部类或方法定义(中某个类型的声明(如成员变量、参数名称或方法名称(与封闭作用域中的另一个声明具有相同的名称,则该声明将隐藏封闭作用域的声明。不能仅通过阴影声明的名称来引用它。

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

正如您所看到的,要获得更高范围的正确值,您只需要使用ShadowTest.this

随着时间的推移,你的代码会发生变化,你可能会在其他作用域中错过相同的名称,所以你必须只使用OuterClass.this来访问外部类作用域,使代码清晰且防弹。

请参阅Java教程。

最新更新