在嵌套类中进行阴影处理的所有可能性

时间:2018-10-28 17:19:35

标签: java inner-classes

我在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);
    }
}

我想在这里强调三个方面:

  1. 我们已经创建了FirstLevel内部类的实例
  2. methodInFirstLevel是非静态的
  3. 我们正在访问
    • x局部的变量methodInFirstLevel
    • FirstLevel实例变量this.x
    • ShadowTest实例变量ShadowTest.this.x

我很快意识到可能有很多可能性。例如:

  1. 在上面的第1点中,我可以添加:
    • 我们可能决定不创建实例,即对类名的调用方法
    • 代替内部类(在上面的同一链接中定义为 非静态嵌套类 ),我们可以处理 静态嵌套类< / em>
  2. 在上面的第二点中,我可以添加,调用静态方法
  3. 在第三点,我可以添加:
    • FirstLevel静态变量
    • ShadowTest静态变量

如果检查,组合会变得很大。我试图弄清楚在所有这些情况下如何进行访问。在下图中,我尝试将其以某种结构化的形式显示。我已经删除了红色字体无法给出的组合。另外,为了更好的说明,我使用了类名InnerClassOuterClassStaticNestedClass(如在上面的链接中所使用的其他示例)。 (#)只是一个占位符,可以让我考虑一下下面要处理的是哪种类型的课程。我已将项目符号放在评论和答案中供您参考。我不确定这里的所有内容,尤其是粉红色的东西。

即使我付出了所有努力,这也让我感到困惑。我要有人确认。尽管我可以对此进行编码并检查每种情况,但我现在非常疲惫。

enter image description here

PS:我可能会愚蠢地提出所有这些不必要的想法。我可能只是想起了上面代码中的内容而感到不寒而栗。如果是这种情况,也请告知。

1 个答案:

答案 0 :(得分:0)

记录您的想法是合法的,我建议创建一个表(或多个表)以便更好地进行概述。

它看起来像这样:

非静态内部类型

                      |   Outer class   |   Inner class  
----------------------+-----------------+----------------
   non-static member  |  Outer.this.x   |  [this.]x
----------------------+-----------------+----------------
       static member  |  Outer.x        |  [Inner.]x

请注意,语法不取决于封装方法,除了不能从静态方法引用非静态变量。

在示例的20 + 21行中,您将通过访问分别为InnerClassOuterClass类型的任意对象的字段来解决此问题。因此,this关键字(以及任何限定的语法)被变量名替换。简而言之,这些行是正确的,但与主题无关。