java - 为什么不能用new关键字在Java中初始化抽象类?

标签 java interface new-operator abstract

我在某处读到我们不能初始化接口(interface),例如:

interface MyInterface{};

而下面的代码肯定是非法的:

MyInterface m = new MyInterface();

我记得我读过的文字说:因为 new 关键字用于为类成员分配内存;所以在接口(interface)的情况下,我们只有抽象函数,所以没有什么可以在接口(interface)中分配;因此,禁止初始化接口(interface)。

好的,这对我来说很有意义。

但是在抽象类的情况下,我们可以声明和定义抽象函数、非抽象函数以及普通变量;那么为什么我们也不允许初始化抽象类呢?因此,我想知道抽象类中的变量(如果有)何时以及如何分配内存?

最佳答案

没有对象永远是“只是”抽象类的实例——它始终是具体 类的实例。否则,您可以调用抽象方法...并且不会调用任何实现。

抽象类中变量的分配方式与任何其他类的变量分配方式相同,这些类恰好是正在初始化的实际类的父类(super class) - 它们“与”来自层次结构中的其他类,基本上。

编辑:澄清一下,这是一个概念限制,也是一个实现限制。抽象类通常包含抽象方法,这就是将其抽象化的原因。抽象方法的要点是允许调用者在编译时检查该方法是否存在,即使抽象类不提供实现。 VM 通过防止“只是”抽象类的实例化来确保一个实现。

现在,即使没有任何抽象方法,抽象类也可以用于防止实例化 - 基本上,抽象类的基本要点是它不能 被直接实例化;只能实例化具体的子类。

关于java - 为什么不能用new关键字在Java中初始化抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7335329/

相关文章:

java - 如何在 JSTL 中显示格式化的日历类型?

java - API 21 中组合多种排序的最佳方式

java - Spring Security - 如何启用方法安全注释?

基于map接口(interface)数组中的key的golang过滤器

c# - 在非泛型接口(interface)中声明泛型方法

java - 慢慢增加 jButton 的大小

c++ - nonptr-new-declarator 中的错误表达式

javascript - Java:使用 JavaScript 上传图像 - 文件损坏、损坏或太大

go - 如何仅给定接口(interface)示例来初始化对象列表?

c++ - 分配数组而不指定大小