Java嵌套类内访问外部类对象的代码合法性咨询
结论
你写的这段代码中,内部类B访问self的语法可以通过编译,但既不是Java内部类访问外部类对象的标准合法实现,代码本身还存在明显的逻辑bug,实际运行必然报错。
细节拆解
- 从语法规则层面看:你定义的B是A的成员内部类,按照Java语法,成员内部类天生可以直接访问外部类的所有成员(包括成员变量、方法),所以你在B的
test2()方法里直接写self.test(),本质是访问外部类A的self成员变量,这行从编译校验上不会报语法错误。 - 你当前的代码存在致命逻辑错误:
- A的构造方法中写的
this.self = self;完全是无效赋值。Java没有Python那样默认存在的self关键字,当前对象的引用固定是this。这行代码里赋值右侧的self因为没有对应的局部变量,编译器会自动将其解析为当前类的成员变量this.self,也就是等价于this.self = this.self;——此时成员变量self还没经过初始化,默认值是null,这行代码等于把null赋值给self自己,最终A实例的self字段永远是null。 - 当你真的调用B的
test2()方法时,self.test()会因为self是null直接抛出空指针异常。
- A的构造方法中写的
- Java设计成员内部类时,本来就内置了访问外部类对象的标准合法方式,根本不需要手动存储外部类引用:成员内部类会自动持有创建它的外部类实例的隐式引用,直接通过
外部类名.this就可以明确拿到对应的外部类对象,不需要额外写成员变量存引用。
参考的正确写法
如果按照内部类的原生设计规范写,等价的可正常运行的代码如下:
class A { public A() {} public void test() {} class B { public void test2() { // 这是内部类访问外部类对象的标准合法写法 A.this.test(); } } }
如果你确实有特殊需求要手动存储外部类的自身引用,正确的赋值逻辑应该是:
class A { A self; public A() { // 正确把当前外部类实例赋值给self字段 this.self = this; } public void test() {} class B { public void test2() { self.test(); } } }
内容的提问来源于stack exchange,提问作者Jibo_Libin
相关产品推荐
相关产品推荐

