You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java抽象类无法实例化?为何该代码能运行并输出结果?

为什么这段代码能"正常运行"?你其实没实例化抽象类!

嘿,这问题挺有意思的——你并没有打破Java的规则,抽象类依然不能直接实例化,这段代码只是用了Java里的「匿名内部类」特性,给你造成了"实例化抽象类"的错觉。

咱们拆解一下这段代码里的关键部分:new MyAbstract() {}

这里的大括号{}是核心:它代表你当场定义了一个没有名字的子类,这个子类继承自抽象类MyAbstract。因为原抽象类里没有定义抽象方法(只有一个普通成员变量),所以这个匿名子类是一个合法的具体类,完全可以被实例化。

换句话说,这段代码等价于在幕后悄悄生成了这样一个类:

// 这是Java编译器帮你生成的匿名子类,只是没有显式的类名
class AnonymousSubclass extends MyAbstract {
    // 你没写任何重写逻辑,所以默认继承父类的所有成员
}

然后new MyAbstract() {}其实是在实例化这个AnonymousSubclass,再把实例的引用赋值给父类类型MyAbstract的变量——这就是Java的多态特性。

你可以做个小实验验证一下:在main方法里加一行代码:

System.out.println(abstractObject.getClass().getName());

运行后你会看到类似Main$1的输出(具体名字取决于你的主类名),这就是那个匿名内部类的类名,完全不是MyAbstract本身,足以证明你创建的是子类实例,而非抽象类的实例。

所以结论很明确:抽象类依然不能被直接实例化,这段代码只是通过匿名内部类的方式,间接创建了抽象类子类的实例,再用父类类型引用它而已。

内容的提问来源于stack exchange,提问作者Howler Wolf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:52:10