抽象类为什么不能实例化

背景是我在二面阿里成功晋级三面后,遇到了一个关于抽象类的难题。面试官问了我一个颇具挑战性的问题:“为什么抽象类不能被实例化,但我们可以new出一个实例来?”这种表述让我有点困惑,因为在官方文档和一些论坛上找到的解释常常是模糊而没有切入点的。这看起来似乎是一个常见但容易被误解的问题。
我尝试用更直观的方式去解释这个问题。假设有一个抽象类叫做Animal,以及两个Animal的子类,分别是Tomcat和JerryMicky。还有一个Food类和MainApp类。在MainApp类中,我们进行了一次调试。
在调试的过程中,我们主要关注Debug栈帧窗的绿色框,观察局部变量表里的数据,尤其是Name列和Value列。当我们查看debug栈帧窗口的Value列时,会发现有类似"MainApp$1"到"MainApp4"这样的对象。这些对象实际上是作为局部变量的匿名内部类的实例。当我们右键点击其中的某一行,比如“animal3”,并选择“Open Declared Type Hierarchy”时,会看到一个Type Hierarchy窗口,其中用红色框标出的是内部类,特别是那些作为局部变量的匿名内部类。
这里的"$"符号表示这是一个内部类,而且是作为局部变量的匿名内部类。这个符号并不指代一个特定的抽象类的实例,而是表明它是一个特定上下文中定义的内部类或匿名内部类的实例。通过这个例子,我们可以更直观地理解抽象类的实例化问题。实际上,我们不能直接通过关键字new来实例化一个抽象类本身,但我们可以实例化它的子类。这个demo可能并不严谨,但它基本说明了这个问题。解释到此结束。
