我在某处读到我们不能初始化接口(interface),例如:
interface MyInterface{};
而下面的代码肯定是非法的:
MyInterface m = new MyInterface();
我记得我读过的文字说:因为 new
关键字用于为类成员分配内存;所以在接口(interface)的情况下,我们只有抽象函数,所以没有什么可以在接口(interface)中分配;因此,禁止初始化接口(interface)。
好的,这对我来说很有意义。
但是在抽象类的情况下,我们可以声明和定义抽象函数、非抽象函数以及普通变量;那么为什么我们也不允许初始化抽象类呢?因此,我想知道抽象类中的变量(如果有)何时以及如何分配内存?
最佳答案
没有对象永远是“只是”抽象类的实例——它始终是具体 类的实例。否则,您可以调用抽象方法...并且不会调用任何实现。
抽象类中变量的分配方式与任何其他类的变量分配方式相同,这些类恰好是正在初始化的实际类的父类(super class) - 它们“与”来自层次结构中的其他类,基本上。
编辑:澄清一下,这是一个概念限制,也是一个实现限制。抽象类通常包含抽象方法,这就是将其抽象化的原因。抽象方法的要点是允许调用者在编译时检查该方法是否存在,即使抽象类不提供实现。 VM 通过防止“只是”抽象类的实例化来确保有一个实现。
现在,即使没有任何抽象方法,抽象类也可以用于防止实例化 - 基本上,抽象类的基本要点是它不能 被直接实例化;只能实例化具体的子类。
关于java - 为什么不能用new关键字在Java中初始化抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7335329/