内部类对象



我无法理解下面代码的行为。

我的期望是它应该以两种println()方法打印100。为什么结果不同?

如果我在内部类中取消注释getX()方法,那么println((方法的输出是相同的,即100。

我无法理解不同行为的原因。请帮我理解。

public class Foo {
public static void main(String[] args) {
MyOuter outerObj = new MyOuter();
MyOuter.MyInner innerObj = outerObj.new MyInner();
innerObj.setX();
System.out.println("x: " + innerObj.getX()); //x: 3
System.out.println("x: " + outerObj.getX()); //x: 100
}
}
class MyOuter {
private int x = 3;
public int getX() { return x; }
class MyInner extends MyOuter {
public void setX(){ x = 100; }
//      public int getX() { return x; }
}
}

MyInner的角度来看,这里有两个private int x字段:

  • MyOuter继承的一个字段super.x,但由于声明为private而无法访问,并且作为继承对象的MyInner无法访问此字段
  • 或舍入MyOuter-实例中的一个字段MyOuter.this.x(由于MyInner是一个(非静态(内部类,它总是绑定到周围MyOuter的实例(,它是可访问的

MyInner中的方法setX()无法访问继承的字段super.x,因此它访问字段MyOuter.this.x并将其值设置为100。对周围MyOutergetX()的连续调用将返回100

调用innerObj.getX()(从MyOuter继承并且可以访问super.x(返回继承字段super.x的值(仍然具有其初始值3(。

如果我们从MyInner中删除extends MyOuter,并在其中包含getX()-方法,那么代码的行为与预期的一样。


MyInner无法访问继承字段private x这一事实一开始令人困惑,但其行为实际上与Hariharan 在本文中讨论的继承类中静态方法上下文中关键字protected的行为一致

最新更新