如果有人能回答这个问题,我会感到惊讶。我是一个初学者,非常努力地使用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”的秘密引用来实现内部类,该引用不会简单地通过在另一个实例上设置InnerTypeMember来更改。
例如,如果您在完全不同的类中具有InnerTypeMember变量,则仍应期望调用set_innerChar_to_outerChar()在为其最初构造内部类的对象上找到Outer.outerChar。