本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:我们可以实例化一个抽象类吗?
在我的一次面试中,面试官问我“我们是否可以实例化一个抽象类?”
我的回答是“不,我们不能。” 但是,面试官告诉我“我错了,抽象类可以被实例化。”
我觉得不是这样。然后面试官告诉我自己在家尝试一下。
abstract class my {
public void mymethod() {
System.out.print("Abstract");
}
}
class poly {
public static void main(String a[]) {
my m = new my() {};
m.mymethod();
}
}
在这里,我正在创建抽象类的实例并调用了抽象类的方法。有人可以向我解释一下吗?面试中我真的错了吗?
热门回答:
在这里,我正在创建抽象类的实例
不,这并不是创建抽象类的实例,而是创建了抽象类的一个匿名子类的实例,然后你在抽象类引用(指m)上调用了子类对象的方法mymethod。
JLS-第15.9.1节中明确列出了此行为:
如果类实例创建表达式以类实体结尾,则实例化的类是匿名类。然后:
- 如果T表示一个类,则声明由T命名的类的匿名直接子类。如果T表示的类是final类,则是编译时错误。
- 如果T表示接口,则声明实现T命名的接口的Object的匿名直接子类。
- 无论哪种情况,子类的主体都是在类实例创建表达式中给出的ClassBody。
- 被实例化的类是匿名子类。