我无法理解以下代码的行为。
我原本期望两个 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
可以访问两个不同的MyOuter
类实例,一个是外部类,可以使用MyOuter.this
访问,另一个是基类,可以使用super
访问。innerObj.getX()
调用了从基类继承来的getX()
方法。似乎未经限定的x
访问了MyOuter.this
实例。要使代码有意义,请删除extends Outer
。 - Andreasprotected
的行为是一致的。详情请参见:https://dev59.com/B4vda4cB1Zd3GeqPZ3pD。 - Turing85private
部分。--- Curious: 在今天之前,如果这个字段不是private
,你能回答未经限定的访问x
是指super.x
还是MyOuter.this.x
吗? - Andreas