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

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

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

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

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

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


当前回答

关于抽象类

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

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

其他回答

关于抽象类

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

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

抽象类不能像每个人回答的那样被实例化,这是一个公认的事实。

当程序定义匿名类时,编译器实际上创建了一个具有不同名称的新类(具有EnclosedClassName$n模式,其中n是匿名类号)

所以如果你反编译这个Java类,你会发现如下代码:

my.class

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

Poly $1.class(匿名类的生成类)

class poly$1 extends my 
{
} 

ploly.cass

public class poly extends my
{
    public static void main(String[] a)
    {
        my m = new poly.1(); // instance of poly.1 class NOT the abstract my class

        m.mymethod();
    }
}

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

技术答案

抽象类不能被实例化——这是通过定义和设计实现的。

摘自JLS,第8章。类:

命名类可以声明为抽象类(§8.1.1.1),并且必须声明 抽象,如果没有完全实现;这样的类是不可能的 实例化,但可以通过子类扩展。

来自JSE 6 java文档的Classes.newInstance():

如果这个类表示一个抽象类,一个接口,一个数组 Class,一个基本类型,或void;或者类没有null构造函数;或者如果 实例化失败是由于其他原因。

当然,您可以实例化抽象类的具体子类(包括匿名子类),也可以对抽象类型的对象引用进行类型转换。

团队合作与社交智商:

在现实世界中,当我们处理复杂的技术和法律规范时,这种技术误解经常发生。

在这里,“人际交往能力”可能比“技术能力”更重要。如果你试图证明自己的观点,那么理论上你可能是正确的,但你也可能在战斗中造成更大的伤害/损害“面子”/制造敌人。以和解和理解的方式解决你们的分歧。谁知道呢——也许你“都是对的”,但对术语的含义略有不同??

谁知道呢——虽然不太可能,但也有可能面试官故意引入一个小冲突/误解,把你置于一个具有挑战性的环境中,看看你在情感和社交方面的表现如何。对同事要有礼貌和建设性,听从前辈的建议,在面试结束后通过电子邮件或电话解决任何挑战/误解。这表明你很积极,注重细节。

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

最好的例子是

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

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

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