内部 class 必须使用 'this' 关键字才能使用外部 class 方法或属性吗?
Must an inner class use 'this' keyword in order to use outer class method or attributes?
我正在阅读 ArrayList 的源代码,这个 class 有一个名为 SubList
的内部 class。我正在寻找内部 class (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
关键字以便 call/use ArrayList
(外部 class)method/attribute。
我想了解是否必须使用 OuterClass.this
或 elementData()
就足够了?我 运行 很久以前(一年多)的一个例子,我能够在不使用 this
关键字的情况下从内部 class 调用外部 class 方法。
存在 阴影 问题,可能导致意外行为和运行时错误。
如果在特定范围(例如内部 class 或方法定义)中的类型声明(例如成员变量或参数名称或方法名称)与另一个名称相同封闭范围内的声明,则该声明隐藏封闭范围的声明。您不能仅通过名称引用隐藏声明。
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
访问外部 class 范围,使代码清晰和防弹。
我正在阅读 ArrayList 的源代码,这个 class 有一个名为 SubList
的内部 class。我正在寻找内部 class (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
关键字以便 call/use ArrayList
(外部 class)method/attribute。
我想了解是否必须使用 OuterClass.this
或 elementData()
就足够了?我 运行 很久以前(一年多)的一个例子,我能够在不使用 this
关键字的情况下从内部 class 调用外部 class 方法。
存在 阴影 问题,可能导致意外行为和运行时错误。
如果在特定范围(例如内部 class 或方法定义)中的类型声明(例如成员变量或参数名称或方法名称)与另一个名称相同封闭范围内的声明,则该声明隐藏封闭范围的声明。您不能仅通过名称引用隐藏声明。
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
访问外部 class 范围,使代码清晰和防弹。