java - 封闭类成员的内部类访问

标签 java class nested

如果有人能回答这个问题,我会感到惊讶。我是一个初学者,在 Java 中嵌套类的语法和逻辑上苦苦挣扎。如果运行以下程序,将打印“a”而不是“b”。为什么?

class MainClass
{
    public static void main(String[] args)
    {
        Outer OuterRefVar_a = new Outer('a');

        Outer OuterRefVar_b = new Outer('b');

        OuterRefVar_a.InnerTypeMember = OuterRefVar_a.new Inner();

        OuterRefVar_b.InnerTypeMember = OuterRefVar_a.InnerTypeMember;

        OuterRefVar_b.InnerTypeMember.set_innerChar_to_outerChar();

        System.out.println(OuterRefVar_b.InnerTypeMember.innerChar);
    }
}
class Outer
{
    char outerChar;

    Outer(char outerChar)
    {
        this.outerChar = outerChar;
    }

    class Inner
    {
        char innerChar;

        void set_innerChar_to_outerChar()
        {
            innerChar = outerChar;
        }
    }

    Inner InnerTypeMember;
}

最佳答案

发生这种情况是因为当您将 A 对象的 InnerTypeMember 引用设置到 B 上时..

OuterRefVar_b.InnerTypeMember = OuterRefVar_a.InnerTypeMember;

A 的内部对象仍然具有对其原始外部对象 A 的引用,并将引用其成员变量。 Java 通过为对象提供对“Outer.this”的 secret 引用来实现内部类,该引用不会简单地通过在另一个实例上设置 InnerTypeMember 来更改。

例如,如果您在完全不同的类中有一个 InnerTypeMember 变量,则调用 set_innerChar_to_outerChar() 仍会在最初构造内部类的对象上找到 Outer.outerChar。

关于java - 封闭类成员的内部类访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48255220/

相关文章:

java - 在 catalinaopts 中附加多个 javaagents

java - 文件在 Java Jersey API 中下载两次

c++ - 没有可用于结构 vector 的成员

elasticsearch - Elasticsearch嵌套查询和排序

ruby-on-rails - 如何在嵌套表单中包含一个 id?

java - JSon 根据应用于其他节点的条件选择节点?

从方法引用的 java.lang.IllegalArgumentException 在类加载器中不可见

c++ - 如何定义具有循环依赖性的 C++ 类?

java - 同一类中的类名变量不理解概念

nested - 在 ionic4 中使用嵌套子路由时,路由在一次主导航更改后停止工作