在我的一次面试中,有人问我:“我们是否可以实例化一个抽象类?”

我的回答是:“没有。我们不能”。但是,面试官告诉我:“错了,我们可以。”

我对此进行了一些争论。然后他让我自己在家试试。

abstract class my {
    public void mymethod() {
        System.out.print("Abstract");
    }
}

class poly {
    public static void main(String a[]) {
        my m = new my() {};
        m.mymethod();
    }
}

在这里,我正在创建我的类的实例和调用抽象类的方法。有人能给我解释一下吗?我的面试真的错了吗?


当前回答

不,你不能实例化一个抽象类。我们只实例化匿名类。在抽象类中,我们只声明抽象方法和定义具体方法。

其他回答

抽象类不能被实例化,但可以被子类化。参见这个链接

最好的例子是

虽然Calendar类有一个抽象方法getInstance(),但是当你说Calendar calc=Calendar.getInstance();

calc引用类GregorianCalendar的类实例为“GregorianCalendar extends Calendar”

事实上,匿名内部类型允许您创建抽象类的一个无名称子类和它的一个实例。

技术部分在其他答案中已经很好地涵盖了,它主要以: “他错了,他什么都不懂,让他加入SO,把一切都弄清楚:)”

我想说明一个事实(在其他回答中已经提到过),这可能是一个压力问题,也是许多面试官更多了解你以及你如何应对困难和不寻常情况的重要工具。通过给你错误的密码,他可能想看看你是否会反驳。要知道在类似的情况下,你是否有信心站起来对抗你的前辈。

附注:我不知道为什么,但我有一种感觉,面试官已经读了这篇文章。

扩展类并不意味着实例化类。实际上,在您的示例中,您正在创建子类的一个实例。

我非常确定抽象类不允许初始化。所以,我会说不:你不能实例化一个抽象类。但是,您可以扩展/继承它。

你不能直接实例化一个抽象类。但这并不意味着您不能间接获得类的实例(实际上不是原始抽象类的实例)。我的意思是你不能实例化原始的抽象类,但是你可以:

创建一个空类 从抽象类继承 实例化派生类

因此,您可以通过派生类实例访问抽象类中的所有方法和属性。

关于抽象类

不能创建抽象类的对象 可以创建变量(可以像数据类型一样运行) 如果子对象不能重写父对象的至少一个抽象方法,那么子对象也将成为抽象对象 如果没有子类,抽象类是无用的

抽象类的目的是表现得像基类。在继承层次结构中,你会看到抽象类位于顶部。

上面实例化了一个匿名的内部类,它是my抽象类的子类。严格来说,它并不等同于实例化抽象类本身。OTOH,每个子类实例都是其所有超类和接口的实例,因此大多数抽象类确实是通过实例化它们的一个具体子类来实例化的。

如果面试官只是说“错了!”而没有解释,并给出了这个例子作为一个独特的反例,我认为他不知道自己在说什么。