1.4 我可以实例化一个抽象类吗?| Java Debug 笔记

151 阅读1分钟

本文正在参加「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。
  • 被实例化的类是匿名子类。