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

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

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

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

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

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


当前回答

关于抽象类

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

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

其他回答

你可以观察到:

为什么poly扩展my?这没用…… 编译的结果是什么?三个文件:my.class, poly.class和poly$1.class 如果我们可以这样实例化一个抽象类,我们也可以实例化一个接口……奇怪的……

我们可以实例化一个抽象类吗?

不,我们不能。我们可以做的是,创建一个匿名类(这是第三个文件)并实例化它。

那么超类实例化呢?

抽象超类不是由我们实例化的,而是由java实例化的。

编辑:请他测试一下

public static final void main(final String[] args) {
    final my m1 = new my() {
    };
    final my m2 = new my() {
    };
    System.out.println(m1 == m2);

    System.out.println(m1.getClass().toString());
    System.out.println(m2.getClass().toString());

}

输出是:

false
class my$1
class my$2

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

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

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

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

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

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

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

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

= my() {};意味着有一个匿名的实现,而不是简单的对象实例化,它应该是:= my()。你永远不能实例化一个抽象类。

关于抽象类

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

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