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
相关产品推荐
相关产品推荐

