封闭类成员的内部类访问

时间:2018-01-14 23:28:48

标签: 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;
}

1 个答案:

答案 0 :(得分:1)

这是因为您将A的对象的InnerTypeMember引用设置为B ..

OuterRefVar_b.InnerTypeMember = OuterRefVar_a.InnerTypeMember;

A的内部对象仍然引用它的原始外部对象A并将引用其成员变量。 Java通过为对象提供对“Outer.this”的秘密引用来实现内部类,这个引用只是通过在另一个实例上设置InnerTypeMember而不会改变。

例如,如果你在一个完全不同的类中有一个InnerTypeMember变量,那么调用set_innerChar_to_outerChar()仍然需要在内部类是原始构造的对象上找到Outer.outerChar。