【问题标题】:Accessibility of members of top level class in inner class?内部类中顶级类成员的可访问性?
【发布时间】:2011-06-05 16:26:44
【问题描述】:

我对成员内部类的顶级类的可访问性有疑问。 我刚刚阅读了本地或匿名内部类只能访问最终变量的原因。原因是 JVM 将这两个类作为完全不同的类处理,因此,如果一个类中的变量值发生变化,则无法在运行时反映时间在另一个类文件中。

然后,我的问题是内部成员类(非静态)如何能够访问顶级类成员的成员,因为 JVM 仍然将这两个类视为不同的类文件?如果顶级类的成员变量的值发生变化,运行时如何反映到内部类的类文件中?

【问题讨论】:

    标签: java accessibility inner-classes nested-class


    【解决方案1】:

    它们是独立的类,但在“内部”类中隐含了对“外部”类实例的引用。它基本上充当一个变量,您可以隐式或通过ContainingClassname.this 的特殊语法获得。

    请注意,如果您想要这样的隐式引用,则应将嵌套类声明为static

    public class Outer
    {
        private class Inner
        {
            // There's an implicit reference to an instance of Outer in here.
            // For example:
            // Outer outer = Outer.this;
        }
    
        private static class Nested
        {
            // There's no implicit reference to an instance of Outer here.
        }
    }
    

    【讨论】:

    • 但是,如果是本地类(方法级别),为什么他们不能也有这样的顶级类的隐式引用来直接使用它的成员而不是声明它们是最终的?
    • @Sumit:因为内部类本身没有变量的副本——只是对外部类实例的引用。只有 local 变量最终会在匿名内部类中生成副本。即使在匿名内部类中,您也可以从封闭实例访问 instance 变量而不是最终变量。
    • 实际上,在这种情况下,我对本地 n 实例变量有点困惑......现在我明白了......@Jon..非常感谢......
    【解决方案2】:

    this 是隐含的 final,你不能改变它。当你写一些像

    class Outer {
        int a;
        class Inner {
           { a = 1; }
        }
    }
    

    其实你写的是一样的

    class Outer {
        int a;
        class Inner {
           { Outer.this.a = 1; }
        }
    }
    

    a 不是最终的,但 Outer.this 是最终的,这就是使用的引用。

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 2011-08-11
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2011-08-09
      • 2019-08-26
      相关资源
      最近更新 更多