我在this页面上遇到了下面的概念代码片段,该页面解释了如何在内部类实例的非静态/实例方法中隐藏相同的命名变量:
public class ShadowTest {
public int x = 0;
class FirstLevel {
public int x = 1;
void methodInFirstLevel(int x) {
System.out.println("x = " + x); //23
System.out.println("this.x = " + this.x); //1
System.out.println("ShadowTest.this.x = " + ShadowTest.this.x); //0
}
}
public static void main(String... args) {
ShadowTest st = new ShadowTest();
ShadowTest.FirstLevel fl = st.new FirstLevel();
fl.methodInFirstLevel(23);
}
}
我想在这里强调三个方面:
FirstLevel
内部类的实例methodInFirstLevel
是非静态的x
局部的变量methodInFirstLevel
FirstLevel
实例变量this.x
ShadowTest
实例变量ShadowTest.this.x
我很快意识到可能有很多可能性。例如:
FirstLevel
静态变量ShadowTest
静态变量如果检查,组合会变得很大。我试图弄清楚在所有这些情况下如何进行访问。在下图中,我尝试将其以某种结构化的形式显示。我已经删除了红色字体无法给出的组合。另外,为了更好的说明,我使用了类名InnerClass
,OuterClass
,StaticNestedClass
(如在上面的链接中所使用的其他示例)。 (#)
只是一个占位符,可以让我考虑一下下面要处理的是哪种类型的课程。我已将项目符号放在评论和答案中供您参考。我不确定这里的所有内容,尤其是粉红色的东西。
即使我付出了所有努力,这也让我感到困惑。我要有人确认。尽管我可以对此进行编码并检查每种情况,但我现在非常疲惫。
PS:我可能会愚蠢地提出所有这些不必要的想法。我可能只是想起了上面代码中的内容而感到不寒而栗。如果是这种情况,也请告知。
答案 0 :(得分:0)
记录您的想法是合法的,我建议创建一个表(或多个表)以便更好地进行概述。
它看起来像这样:
非静态内部类型
| Outer class | Inner class
----------------------+-----------------+----------------
non-static member | Outer.this.x | [this.]x
----------------------+-----------------+----------------
static member | Outer.x | [Inner.]x
请注意,语法不取决于封装方法,除了不能从静态方法引用非静态变量。
在示例的20 + 21行中,您将通过访问分别为InnerClass
和OuterClass
类型的任意对象的字段来解决此问题。因此,this
关键字(以及任何限定的语法)被变量名替换。简而言之,这些行是正确的,但与主题无关。