我无法理解下面代码的行为。
我的期望是它应该以两种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
。对周围MyOuter
的getX()
的连续调用将返回100
。
调用innerObj.getX()
(从MyOuter
继承并且可以访问super.x
(返回继承字段super.x
的值(仍然具有其初始值3
(。
如果我们从MyInner
中删除extends MyOuter
,并在其中包含getX()
-方法,那么代码的行为与预期的一样。
MyInner
无法访问继承字段private x
这一事实一开始令人困惑,但其行为实际上与Hariharan 在本文中讨论的继承类中静态方法上下文中关键字protected
的行为一致