Java内部类继承父类时成员访问差异问题咨询
问题拆解:内部类继承外部类时的变量作用域谜题
嘿,这个问题的核心其实是Java里非静态内部类继承外部类时的变量作用域优先级问题,我给你一步步拆解明白:
先搞懂innerObj的双重身份
你创建的innerObj是个特殊的对象,它同时拥有两个身份:
- 它是
MyOuter的子类实例:继承了MyOuter的所有成员,包括私有变量x(初始值为3); - 它是
MyOuter的非静态内部类实例:持有创建它的外部类对象(也就是outerObj)的引用,能直接访问外部类的成员。
这意味着innerObj里同时存在两个独立的x:一个是自己继承来的x,另一个是外部类outerObj的x!
原代码行为差异的原因
1. setX()方法实际修改的是哪个x?
你在MyInner的setX()里写x = 100时,Java的作用域规则会优先把x解析为外部类宿主实例(outerObj)的x——因为内部类的作用域优先级更高,哪怕父类有同名变量,也会先访问外部类的成员。所以这一步修改的是outerObj的x,把它从3改成了100。
2. 两个getX()调用的区别
innerObj.getX():因为MyInner没重写getX(),所以调用的是父类MyOuter的getX()方法。这个方法里的return x,指的是父类MyOuter的成员变量——也就是innerObj自己继承来的那个x(从来没被修改过,还是初始值3),所以输出3。outerObj.getX():直接调用自己的getX()方法,返回的是已经被setX()修改过的x(100),所以输出100。
取消MyInner中getX()注释后为什么结果一致?
当你给MyInner加上自己的getX()方法:
public int getX() { return x; }
这里的x同样遵循内部类的作用域规则,优先指向外部类宿主实例的x(已经被设为100)。所以innerObj.getX()返回100,和outerObj.getX()的结果就完全一致了。
额外补充:明确区分两个x的写法
如果想在MyInner里精准操作不同的x,可以用限定符明确指定:
- 操作自己继承来的
x:使用super.x(比如super.x = 200); - 操作外部类宿主实例的
x:使用MyOuter.this.x(比如MyOuter.this.x = 100)。
内容的提问来源于stack exchange,提问作者Alok
相关产品推荐
相关产品推荐

