当前位置: 首页 > 面试题库 >

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

阙繁
2023-03-14
问题内容

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

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

我对此有些争论。然后他告诉我自己在家尝试这个。

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

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

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


问题答案:

在这里,我正在创建我的课程的实例

不,你不是在这里创建抽象类的实例。而是要创建抽象类的匿名子类的实例。然后,你在抽象类引用上调用指向子类对象的方法。

JLS-第15.9.1节中明确列出了此行为:

如果类实例创建表达式以类主体结尾,则实例化的类是匿名类。然后:

  • 如果T表示一个类,则声明由T命名的类的匿名直接子类。如果T表示的类是最终类,则是编译时错误。
  • 如果T表示接口,则声明实现T命名的接口的Object的匿名直接子类。
  • 无论哪种情况,子类的主体都是类实例创建表达式中给出的ClassBody。
  • 被实例化的类是匿名子类。
    强调我的。

另外,在JLS-第12.5节中,你可以阅读有关对象创建过程的信息。我将在此引用一个声明:

每当创建新的类实例时,都会为其分配存储空间,并为该类类型中声明的所有实例变量和该类类型的每个超类中声明的所有实例变量(包括所有可能隐藏的实例变量)分配空间。

在返回对新创建对象的引用作为结果之前,使用以下过程处理指示的构造函数以初始化新对象:

你可以在我提供的链接上阅读有关完整过程的信息。

要实际上看到要实例化的类是Anonymous SubClass,你只需要编译两个类。假设你将这些类放在两个不同的文件中:

My.java:

abstract class My {
    public void myMethod() {
        System.out.print("Abstract");
    }
}

Poly.java:

class Poly extends My {
    public static void main(String a[]) {
        My m = new My() {};
        m.myMethod();
    }
}

现在,编译两个源文件:

javac My.java Poly.java

现在,在编译源代码的目录中,你将看到以下类文件:

My.class
Poly$1.class  // Class file corresponding to anonymous subclass
Poly.class

看到那个课- Poly$1.class。它是由编译器创建的类文件,与你使用以下代码实例化的匿名子类相对应:

new My() {};

因此,很明显,正在实例化另一个类。只是,该类仅在编译器编译后才被命名。

通常,将使用以下方式来命名你的类中的所有匿名子类:

Poly$1.class, Poly$2.class, Poly$3.class, ... so on

这些数字表示这些匿名类在封闭的类中出现的顺序。



 类似资料:
  • 问题内容: 我读过我们只能通过继承抽象类来实例化它,但是我们不能直接实例化它。 但是,我看到我们可以通过调用另一个类的方法来创建具有抽象类类型的对象。 例如- 是一个抽象类,我们可以通过在该类中调用function 来实例化它: 抽象类如何在这里实例化? 问题答案: 您不能直接实例化一个抽象类,但是可以在没有具体类的情况下创建一个匿名类: 这也适用于接口。

  • 我在SCJP6中读到抽象类不能实例化。但在某个地方读到它们可以实例化。是真的吗?我是Java的新手,希望有人能详细解释一下。一个例子也是很好的。

  • 据我所知,Java抽象类不能实例化。然而,(抽象类)具有以下方法: 获取文档中提供了有关JAXP和Properties的更多详细信息。有谁能对此作更清楚的解释吗?。

  • 问题内容: 我明白: 由于抽象类本身并不是什么,例如车辆,我们想要创建一个具体实现的对象,例如Car,Bike等。 对象链期间将调用抽象类的构造函数。 我们永远不能直接创建抽象类的对象,即使它包含构造函数并且所有方法都已实现。 但是从编译器的角度来看,Java为什么要强制执行这些规则? 问题答案: 这不是技术限制,而是(如您所指出的)逻辑上的限制。Java(和许多其他语言)执行各种规则不是因为它们

  • 我知道抽象类不能被实例化,但在这段代码中被混淆了。这个代码到底是什么意思?

  • 我知道类和抽象类的主要区别是,抽象类不能被实例化, 但是我可以为抽象类创建对象 我用新的关键字创建了抽象的对象 我有一些问题在 Inet 上没有正确的答案, new关键字是否用于实例类? 2)实例只不过是对象吗? 3)mEarth被称为物体(地球的实例)吗? 现在我可以调用任何方法(作为回调或作为值返回)mearth . sand();mearth . land();使用地球物体