【发布时间】:2020-09-18 22:16:55
【问题描述】:
我无法理解以下代码的行为。
我的期望是它应该在两个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。 -
仅供参考: 我是一位经验丰富的 Java 程序员,但如果您问我是否可以通过非限定访问访问
super实例或MyOuter.this实例,我需要查阅手册来回答这个问题。拥有与外部类和基类相同的类是错误的,在现实生活中永远不应该发生。如果是这样,那么代码应该总是限定字段访问,以确保每个人都理解代码在做什么。如果编译器失败并显示“ambiguois access”错误消息,我会更喜欢。 -
@Turing85 LOL,我们同时互相评论。我错过了
private部分。 --- 好奇:在今天之前,如果字段不是private,您是否能够回答对x的无资格访问是指super.x还是MyOuter.this.x?跨度>
标签: java inner-classes