为什么数组是对象,但不能用作基类?
Java 语言规范指定
在 Java 编程语言数组中,对象是对象 (§4.3.1),是动态创建的,可以分配给 Object 类型的变量 (§4.3.2)。类的所有方法都可以在数组上调用。
Object
那么,考虑到数组是对象 - 为什么Java设计人员决定不允许从它继承和重写,例如toString()
或?equals()
当前的语法不允许创建以数组作为基类的匿名类,但我不认为这是他们决定的原因。
Java 语言规范指定
在 Java 编程语言数组中,对象是对象 (§4.3.1),是动态创建的,可以分配给 Object 类型的变量 (§4.3.2)。类的所有方法都可以在数组上调用。
Object
那么,考虑到数组是对象 - 为什么Java设计人员决定不允许从它继承和重写,例如toString()
或?equals()
当前的语法不允许创建以数组作为基类的匿名类,但我不认为这是他们决定的原因。
Java是非对象语言和当时非常慢的语言之间的折衷,当时一切都是对象(想想Smalltalk)。
即使在最近的语言中,在语言级别为数组(通常是映射)提供快速结构也被认为是一个战略目标。大多数人不喜欢数组的可继承对象的重量,当然,在JVM像JIT一样发展之前,没有人想要这样。
这就是为什么数组虽然是对象,但并没有被设计为类实例(“对象是类实例或数组”)。能够重写数组上的方法没有什么好处,当然也不能很好地抵消检查要应用的正确方法的需要(在我看来,这不是一个足以抵消代码阅读中增加的难度的好方法,类似于重写运算符时发生的情况)。
我在引擎盖下遇到了 - 对象和数组,它解释了几乎所有你需要知道的关于JVM如何处理数组的东西。在JVM中,数组是用特殊的字节码处理的,不像我们熟悉的其他对象。
在 JVM 指令集中,除数组外,所有对象都使用同一组操作码进行实例化和访问。在Java中,数组是成熟的对象,并且与Java程序中的任何其他对象一样,它是动态创建的。数组引用可以在任何调用对类型 Object 的引用的位置使用,并且可以在数组上调用 Object 的任何方法。然而,在 Java 虚拟机中,数组是使用特殊的字节码处理的。
与任何其他对象一样,数组不能声明为局部变量;只有数组引用可以。数组对象本身始终包含基元类型的数组或对象引用的数组。如果声明对象数组,则将获得对象引用的数组。对象本身必须使用 new 显式创建,并分配给数组的元素。
数组是动态创建的对象,它们充当容器,用于保存(常量)数量的相同类型的对象。看起来数组不像任何其他对象,这就是为什么它们被区别对待。