You need to enable JavaScript to run this app. 同包下其他类中如何实例化嵌套内部类并用外部类引用接收
优惠活动
大模型
产品
解决方案
定价
更多

同包下其他类中如何实例化嵌套内部类并用外部类引用接收

报错的根本原因

你定义的Inner是Outer的非静态成员内部类,这类内部类的实例不能脱离Outer实例独立存在:每一个非静态内部类的实例,都会隐式持有一个创建它的Outer实例的引用,因此无法像普通独立类一样直接写new Inner()。
你原本的代码逻辑里,Inner继承自Outer,因此把Inner实例赋值给Outer类型引用的多态设计本身是完全合法的,报错的唯一来源就是new Inner()缺少必须的外部类实例关联,和多态逻辑无关。

可行的等效实现

严格保留Outer O1 = new Inner();一字不差的写法是无法通过编译的,这是Java语法对非静态成员内部类的硬性约束,没有绕过空间。但我们可以实现完全匹配你核心诉求的效果:在main方法中创建Inner实例,并将其赋值给Outer类型的引用,只需要按照非静态内部类的创建规则补上必要的关联步骤即可:

  1. 先创建一个作为依附锚点的Outer类实例
  2. 通过这个锚点实例,按照内部类专属语法创建关联的Inner实例,再直接赋值给Outer类型的引用

对应的可运行Main代码如下:

public class Main {
    public static void main(String[] args) {
        // 创建非静态内部类必须依附的外部类锚点实例
        Outer anchorOuter = new Outer();
        // 通过锚点实例创建Inner实例,赋值给Outer类型的引用
        Outer O1 = anchorOuter.new Inner();
    }
}
补充提示
  • 如果你把Inner类的定义改成静态嵌套类(也就是在class Inner前加上static修饰符:static class Inner extends Outer),它就不再需要依附外部类实例,可以直接通过new Outer.Inner()的语法创建,但这和你当前定义的内部类类型不匹配,无法在不修改Outer类定义的前提下实现。
  • 由于当前的Inner设计同时存在「继承自Outer」、「持有一个独立的依附Outer实例」两个特性,它的实例中会存在多个独立的x字段:依附锚点实例的x=90、从父类Outer继承来的实例字段、自身定义的x=150,这是Java语法允许的特殊行为,不影响实例的正常创建和使用。

内容的提问来源于stack exchange,提问作者Shubham Saurabh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.11 16:54:03