在Java中,为什么数组对象? 有什么具体原因吗?

Java中的数组是对象有什么理由吗?

因为Java语言规范如此说 🙂

在Java编程语言中,数组是对象(§4.3.1),是动态创建的,可以分配给Object类型的变量(§4.3.2)。 可以在数组上调用Object类的所有方法。

因此,与C ++不同,Java提供真正的数组作为第一类对象:

  • 有一个length成员。
  • 有一个clone()方法,它覆盖了Object类中同名的方法。
  • 加上Object类的所有成员。
  • 如果尝试访问数组超出范围,则抛出exception。
  • 数组在动态内存中实现。

将数组作为对象意味着您可以使用它们进行操作(例如,someArray.count(’foo’))而不是仅仅对它们进行操作(例如,count(someArray,’foo’)),这会导致更自然的语法。

另一点是对象是可变的并且通过引用传递。 在数组中,没有任何字段/方法可用于更改数组的“属性”,但您确定可以改变元素值。 通过引用传递数组的好处非常明显(尽管函数式程序员可能希望Java具有通过值传递的不可变列表)。

编辑:忘了提。 在自动装箱之前的时期,能够将数组存储在集合中,将它们写入ObjectStreams等是有帮助的。

此链接解释了为什么数组是Java中的对象(在文章的开头)。

可能是因为他们希望尽可能地将一切都变成一个对象。 本机类型用于向后兼容。

这样他们就可以获得所有好处:

  • GetHashCode的()
  • 的toString()

等等

并且数组不是“原始的”,所以如果它们不能是原始的,它们必须是对象。

我不确定官方的原因。

但是,我认为它们是对象是有意义的,因为可以对它们执行操作(例如占用长度),并且将这些操作作为成员函数支持更有意义,而不是引入新的关键字。 其他操作包括clone(),对象的inheritance操作等。数组也是可清除的并且可能具有可比性。

这与C(和C ++中的本机数组)不同,其中数组本质上是指向内存偏移的指针。