首页 > Java > java教程 > Java 中可以实例化抽象类吗?

Java 中可以实例化抽象类吗?

Patricia Arquette
发布: 2024-12-07 20:42:14
原创
578 人浏览过

Can You Instantiate an Abstract Class in Java?

抽象类的实例化

在面试场景中,可能会出现抽象类能否实例化的问题。传统上,答案是我们无法实例化抽象类,因为它们代表概念或不完整的定义。然而,最近的一则面试轶事对这个概念提出了挑战。

面试难题

在面试过程中,候选人被问到是否可以实例化一个抽象类。最初的回答是“不”,但采访者用示范来反驳。给出了以下代码:

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

class Poly {
    public static void main(String[] a) {
        My m = new My() {};
        m.myMethod();
    }
}
登录后复制

匿名子类

谜题的关键在于实例化行:

My m = new My() {};
登录后复制

这里,我们不是直接创建抽象类 My 的实例。相反,我们正在创建 My 的匿名子类的实例。匿名子类是由编译器动态创建的未命名子类。这个匿名子类实现了抽象方法 myMethod()。

对象创建过程

要理解此行为,让我们参考 Java 语言规范 (JLS)。 12.5 节描述了对象创建过程。创建新对象时,将为该对象及其所有超类中的实例变量分配内存。在返回对象引用之前,会处理构造函数来初始化对象。

编译证据

为了进一步证明匿名子类的存在,我们可以编译代码。将生成以下类文件:

  • My.class
  • Poly$1.class(匿名子类)
  • Poly.class

匿名子类类文件(Poly$1.class)证明我们正在创建子类的实例,而不是抽象类本身。

结论

虽然看起来违反直觉,但我们可以通过创建匿名子类来实例化抽象类。此行为由 Java 虚拟机 (JVM) 启用,它允许动态创建匿名子类。然而,重要的是要记住,我们创建的对象仍然是匿名子类的实例,而不是直接抽象类。

以上是Java 中可以实例化抽象类吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板